如何管理多个承诺
How to manage multiple promises
我正在使用node.js编写一个爬网程序。首先,我需要获取主页以获取该页面上每个项目的URL,然后我爬网每个项目的URL以逐个获取它们的详细信息
fetchPage(url)
是获取链接的HTML文本
function fetchPage(url){
return new Promise(
(resolve,reject)=>{
agent
.get(url)
.end(function(err,res){
if (err){
reject(err);
} else{
resolve(res.text);
}
});
});
}
这是这个爬虫的全球呼叫
fetchPage(link).then(
(result)=>{
const urls=getUrls(result);
for (var i=0;i<5;i++){
fetchItem(urls[i].link).then(
(result)=>{
console.log('Done');
},
(error)=>console.log(error)
);
}
},
(error)=>console.log(error)
);
在获取主页(通过getUrls
)后,我进行了处理以获取所有项目的URL
fetchItem(url)
是另一个Promise
,它确保项目的每个HTML文本在被fetchPage
提取后都应该通过getItem
进行处理
function fetchItem(url){
return new Promise(
(resolve,reject)=>{
fetchPage(url).then(
(result)=>{
getItem(result);
},
(error)=>reject(error)
);
});
}
它确实会爬行。它确实得到了我需要的所有物品,而且没有任何信息缺失。
但是我的代码有问题。为什么控制台不为我记录Done
消息?
结果的顺序不正确。爬网结果的顺序与我预期的不同,它与网站上的顺序不同。
请指出我对这些异步控制有什么误解和错误?如何保证他们的秩序?如何修复此代码以满足要求?
如果我想在所有项目都被完全爬网后记录消息All done
,确保它们完全按正确顺序提取,该怎么办?
Done
没有被调用,因为您没有解析在fetchItem
函数中创建的Promise
。
我想为了维护结果的顺序,你可能需要使用Promise.all。当所有项目都被完全爬网时,它也将有助于获得All done
消息。
我将从更改fetchPage
函数开始,通过使用map
将urls
转换为fetchItem
承诺的数组,我可以将其传递给Promise.all
。像这样的
fetchPage(link).then(
(result)=>{
const urls=getUrls(result);
var promises = urls.map((url) => fetchItem(url.link));
Promise.all(promises).then((values) => {
console.log('All done');
console.log(values);
}, (error) => {
console.log(error);
});
},
(error)=>console.log(error)
);
然后将解析添加到CCD_ 18方法中。
function fetchItem(url){
return new Promise(
(resolve,reject)=>{
fetchPage(url).then(
(result)=>{
resolve(getItem(result));
},
(error)=>reject(error)
);
});
}
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 如何访问声音管理器2创建的声音对象
- 从函数返回角度承诺
- JS编译器/包管理器,用于版本控制
- Firebase2(Firebase.google.com)推送通知-从外部管理
- 以角度管理动态URL
- React Redux错误页面管理
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 让Webpack管理Quirky AMD定义的最佳方式
- 如何在p5.js中管理多智力竞赛游戏的多个屏幕
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- JavaScript管理具有重复属性名称的对象属性
- 简单的ES6承诺问题-交换解决和拒绝参数
- 如何管理多个承诺
- 管理承诺依赖项
- angularJS services——用于检索数据的返回承诺和用于管理数据的对象