![](/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.