我有一个功能:

var third = function(classes){
  for (var i = 0; i <= (classes.length-1); i++) {
       var Myurl = classes[i];

       return function(Myurl){
          request(Myurl,  function(err, resp, body) {
             if (!err && resp.statusCode == 200) {
                var $ = cheerio.load(body);
                $("#item_details dl").each(function() {
                   var Values = [];
                   var New = [];

                   Values=$(this).find("dd strong").text();

                   New = Values.replace(/[\n\t\r]/g,"");
                   AllLinks.push(New);
                });

                console.log(AllLinks);
             };
          })
       }(MyUrl);

  };
};


问题是当我执行上述操作时,我只得到(i=0)中第一个循环元素console.log(AllLinks)的结果。如何正确在节点中循环?我是Node的新手,因此非常感谢任何评论!

编辑:
如果我在AllLinks中定义request,那么它似乎可以工作,但顺序不正确...

var third = function(classes){
      for (var i = 0; i <= (classes.length-1); i++) {
           var Myurl = classes[i];

            (function(Myurl){
              request(Myurl,  function(err, resp, body) {
                 if (!err && resp.statusCode == 200) {
                    var $ = cheerio.load(body);
                    AllLinks=[];
                    $("#item_details dl").each(function() {
                       var Values = [];
                       var New = [];

                       Values=$(this).find("dd strong").text();

                       New = Values.replace(/[\n\t\r]/g,"");
                       AllLinks.push(New);
                    });

                    console.log(AllLinks);
                 }(Myurl);
              })
           };

      };
    };

最佳答案

主要问题(除“ return”外)是,假设请求执行异步操作,则当请求未完成时函数将返回,因此日志不包含任何更新。

您通常有两种策略:


如上例所示,调用代码时不返回“ return”。这个案例
您所有的请求最终都会完成,但您无法控制
在什么时候。当您不需要它们全部进行时,它会很好地工作,
例如之后处理AllLinks
使用支持等待所有呼叫完成的任何技术(async.js或promises)。例如这里Simplest way to wait some asynchronous tasks complete, in Javascript?


因此,您需要:

function appendResultToItems(url, callback) {
 request(url,  function(err, resp, body) {
   if (!err && resp.statusCode == 200) {
     var $ = cheerio.load(body);
     $("#item_details dl").each(function() {
       var Values = [];
       var New = [];

       Values=$(this).find("dd strong").text();

       New = Values.replace(/[\n\t\r]/g,"");
       AllLinks.push({result:New, url: url});
       callback();
     });
 });
}

var calls = [];

classes.forEach(function(Myurl){
  calls.push(function(callback) {
    appendResultToItems(Myurl, callback);
  });
});

async.parallel(calls, function() {
  console.log(AllLinks);
});

10-06 11:22