如何在节点js中循环,等到每次迭代

时间:2015-05-26 09:58:38

标签: javascript node.js loops

我有一个功能:

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)的结果。如何在节点中正确循环?我是节点的新手,所以任何评论都非常感谢!

编辑: 如果我在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);
              })
           };

      };
    };

3 个答案:

答案 0 :(得分:4)

主要问题(除了'return')是假设请求执行异步操作,你的函数在请求未完成时返回,因此log不包含更新。

您通常有两种策略:

  1. 如上例所示,在没有“返回”的情况下调用您的代码。这个案例 您的所有请求最终都会完成,但您无法控制 在什么时候。当你不需要它们全部继续时,它运作良好, 例如之后处理AllLinks
  2. 使用任何支持等待所有呼叫完成的技术(async.js或promises)。例如Simplest way to wait some asynchronous tasks complete, in Javascript?
  3. 因此你需要:

    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);
    });
    

答案 1 :(得分:1)

使用async.js#eachSeries将异步函数应用于集合的每个元素

答案 2 :(得分:1)

您的问题是您在循环中使用返回。如果您只是使用IIFE

<script type="text/javascript">
$(document).ready(function() {
    $(".show_other").change(function(){
        if($(this).is(":checked"))
        {
            $("#other1").hide();
        }
    });
});

</script>

<form id="myform">
    <div>Choose option:
        <input type="radio" name="user_options" value="css" class="show_other" /> CSS 
        <input type="radio" name="user_options" value="jquery" /> jQuery 
        <input type="radio" name="user_options" value="html" /> HTML
        <input type="radio" name="user_options" value="xml" /> XML
    </div>

    <div>Another option:
        <input type="radio" name="user_site" value="Google" class="show_other" /> Google
        <input type="radio" name="user_site" value="Yahoo" /> Yahoo
        <input type="radio" name="user_site" value="Facebook" /> Facebook
        <input type="radio" name="user_site" value="Twitter" /> Twitter
    </div>

    <div class="row" id="other1">
        <textarea class="form-control" rows="4" id="specification" name="specification" placeholder="Enter Specification"></textarea>
    </div>

</form>

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); $("#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); }; }; 将正确生成。