gpt4 book ai didi

For 循环内的 JavaScript 顺序/同步回调函数

转载 作者:行者123 更新时间:2023-11-28 18:03:50 26 4
gpt4 key购买 nike

我目前遇到这种情况...

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

传递给loop的回调函数如下...

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

关于For 循环内的 JavaScript 顺序/同步回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43058835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com