![](/img/trans.png)
[英]How can I wait for asynchronous callback inside Javascript synchronous loop to finish before proceeding
[英]JavaScript Sequential / Synchronous Callback Functions Inside For Loop
我目前有这种情况...
function loop (num1, callback) {
for (i = 0; i < num1; i++) {
console.log("loop count: " + i);
callback();
}
}
当前正在输出以下示例结果:
loop count: 1
loop count: 2
loop count: 3
...
loop count: num1 - 1
callback output 1
callback output 2
callback output 3
...
callback output num1 - 1
我要执行的操作是等到每个回调完成执行并输出其结果,然后再移至循环中的下一项。 即按照下面的示例输出:
loop count: 1
callback output 1
loop count: 2
callback output 2
loop count: 3
callback output 3
...
loop count: num1 - 1
callback output num1 - 1
有谁知道我如何在我的函数中实现这种顺序/同步操作模式?
先谢谢您的帮助!
更新...
好的,所以像这样调用回调函数...
loop(10, updateDB);
传递给循环的回调函数如下...
function updateDB(sql_string, responseObject) {
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'user',
password : 'password',
database : 'database',
});
connection.connect();
var query = sql_string;
connection.query(query, function(err, results) {
connection.end();
if (err) {
console.log(err);
responseObject.push({"queryStatus":"FAIL"});
}
if (err == null) {
console.log('Changed ' + results.changedRows + ' rows');
responseObject.push({"queryStatus":"PASS"});
}
});
};
您的回调显然是异步的,但这并没有使您在继续循环之前强迫其全部执行的愿望消失了。 这是一种使用Promises调用下一个循环周期的方法。
function loop(max, callback, i) { i = i || 0; if (i < max) { console.log("loop count: " + i); return callback(i).then(function() { return loop(max, callback, ++i); }); } } function doAsyncStuff(passedNum) { return new Promise(function(resolve, reject) { // Fake asynchronous stuff for 500ms using setTimeout. // Put your real async code here, calling "resolve" when // it's finished. setTimeout(function() { console.log("callback count: " + passedNum); resolve(); }, 500); }); } loop(5, doAsyncStuff).then(function() { console.log('All done looping!') });
您可以使用javascript的承诺来使用它
function callback(item) {
return new Promise(function(resolve, reject) {
console.log('callback item ', item);
resolve(item);
});
}
function loopCall(num) {
for (var i = 1; i < num; i++) {
console.log('loop item ', i);
callback(i).then(function(data) {
}, function(err) {
console.log(err);
console.log('Something Broke');
})
}
}
loopCall(120);
这是获取所需输出的方法。如果要使用node.js环境,并且有一个npm模块async 。
希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.