我编写了这个函数,它应该运行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();
}
}
答案 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或注册变量之类的内容,该变量跟踪所有调用是否已经返回。