Spe*_*her 4 javascript asynchronous node.js cheerio
我正在使用请求和cheerio节点模块来创建从网站获取一些数据.我想得到一个项目列表,一旦这个列表完成,调用一个异步函数:
request('http://myurl', function(req,res,data){
var $ = cheerio.load(data);
var List = [];
$('.myItems').each(function(i, element){
console.log( typeof $(this).text() )
List.push($(this).text());
});
for (var i=0; i < List.length; i++){
// make an asynchronous call to a API
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题是如何等待列表完成,即,我怎么知道.each函数已遍历所有项目?
我能用异步做到这一点吗?
谢谢
Den*_*ret 12
.eachcheerio 的功能是同步的(参见来源).因此,只要您在回调中不执行任何异步操作(在问题中就是这种情况),就无需执行任何操作:在以下行中,循环将完成.
如果你做调用循环异步函数,最清洁,最简单的解决方法是使用一个承诺库.
以顺序方式(例如Bluebird):
var p = Promise.resolve();
$('.myItems').each(function(i, element){
p = p.then(function(){
// do something with $(this).text() and return a promise
});
});
p.then(function(){
// all asynchronous tasks are finished
});
Run Code Online (Sandbox Code Playgroud)
如果不需要顺序请求(这里是Q的示例):
Q.allSettled($('.myItems').map(function(){
// return a promise
})).then(function(){
// all asynchronous tasks are finished
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10451 次 |
| 最近记录: |