如何在客户端立即显示站点的扫描 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
我正在使用 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