如何在客户端立即显示站点的扫描 url 数组?

how can I show the scanned url array of the site instantly on the client side?

我正在使用 apollo 服务器扫描网站的站点地图。但是当我从游乐场发送请求时,它会在不等待函数完成的情况下给出结果。如何保留扫描结果?我怎样才能在客户端立即显示站点的扫描 url 数组?

如果我使用graphql订阅,我需要一个一个保存数据。这将是大量数据。

注意:系统正在运行,数据正在保存在mongoose中。

scanSitemap: async (parent, { id, data }, { WebLink }) => {

    let dataset = [];

    const generator = await SitemapGenerator('https://example.org', {
      stripQuerystring: false,
      filepath: null
    });

    generator.start();

    generator.on('add', (url) => {
      dataset.push(url);
      console.log(dataset);
    });

    generator.on('done', () => {
      return new WebLink({
        status: 1, domain: 'test', websiteId: id, urls: dataset
      }).save();
    });

  },

在这种情况下,您的 scanSitemap 解析器需要 return 一个仅当 'done' 事件从 SitemapGenerator[= 发出时才解析的 Promise 19=]

为什么?好吧,根据 ApolloServer 文档:

Resolvers often perform asynchronous actions, such as fetching from a database or back-end API. To support this, a resolver can return a promise that resolves to any other supported return type. (https://www.apollographql.com/docs/apollo-server/data/resolvers/#return-values)

在这种情况下,您的解析器肯定在执行异步操作——站点地图抓取——所以这是使用 Promises 的好情况。

通过 returning a Promise,您指示 Apollo Server 等待异步操作的结果可用。根据你的代码,我相信你想在一天结束时解决这个问题:

new WebLink({
  status: 1, domain: 'test', websiteId: id, urls: dataset
}).save()

我已经重写了您的代码以使用 Promises(我也在我这边测试了它,它有效!)

scanSitemap: async (parent, { id, data }, { WebLink }) => {
  // Returning a new promise inside of the GraphQL resolver
  // that accepts a callback with a resolve argument that we'll use later
  return new Promise((resolve) => {
    let dataset = [];

    // No need to await SitemapGenerator
    const generator = SitemapGenerator('https://example.org', {
      filepath: null,
      stripQuerystring: false,
    });

    generator.start();

    generator.on('add', (url) => {
      dataset.push(url);
      console.log(dataset);
    });

    generator.on('done', () => {
      // Resolving the promise
      // and telling ApolloServer that our GraphQL resolver result is ready
      resolve(
        new WebLink({
          domain: 'test',
          status: 1,
          urls: dataset,
          websiteId: id,
        }).save(),
      );
    });
  });
};

这里有一个关于 Promises 的重要资源,如果您有进一步的兴趣:

https://dev.to/lydiahallie/javascript-visualized-promises-async-await-5gke