.each和回调

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)