Nodejs用于循环回调问题

时间:2016-03-10 00:45:16

标签: javascript nodes

我编写了这个函数,它应该运行for for循环,然后在最后运行回调,但它在完成循环之前一直运行回调。我读过的唯一解决方案是使用回调来解决这个问题,但它似乎并没有太大的区别。

function run(callback){
  for(var i = 0; i < urls.length; i++){
    request(url, function(error, resp, body){
      //uses cheerio to iterate through some elements on the page
      //then saves to an object for a future response  
    });
    callback();
  }
}

3 个答案:

答案 0 :(得分:1)

我会添加一个名为totaltasks的变量和另一个名为tasksfinished的变量。然后,当请求完成时tasksfinished增加,并在tasksfinished等于totaltasks时调用您的回调:

function run(callback){
  var totaltasks = urls.length;
  var tasksfinished = 0;

  // helper function
  var check = function() {
    if(totaltasks == tasksfinished) {
       callback();
    }
  }

  for(var i = 0; i < totaltasks; i++){
    try {
      request(url, function(error, resp, body) { 

        tasksfinished++;
        check();
     });
    } catch(e) {
      tasksfinished++;
      check();
    }
  }
};

答案 1 :(得分:0)

您需要在请求回调中移动回调函数:

//Alert to select more method
func moreAlert()
{           
    let optionMenu = UIAlertController(title: "Mere", message: "", preferredStyle: UIAlertControllerStyle.ActionSheet)

    let Edit = UIAlertAction(title: "Rediger", style: .Default, handler: { action in

    })


    let Delete = UIAlertAction(title: "Slet", style: .Default, handler: { action in

    })

    let cancelAction = UIAlertAction(title: "Annullere", style: .Cancel, handler: { action in        
        print("Cancelled")
    })

    optionMenu.addAction(Edit)            
    optionMenu.addAction(Delete)            
    optionMenu.addAction(cancelAction)


    self.presentViewController(optionMenu, animated: true, completion: nil)
}

答案 2 :(得分:0)

首先,您的代码示例缺少一些括号。 constructor(public service: DataService) { this.name = 'Angular2' } 可能是异步库。因此,在它的函数调用它注册事件循环并立即返回。这意味着您实际上立即调用了回调,可能没有请求完成。因此,与异步函数同步循环不起作用。

使用诸如Promises,Continuation Passing或注册变量之类的内容,该变量跟踪所有调用是否已经返回。