【发布时间】:2020-03-19 19:49:47
【问题描述】:
我有一个 for 循环,其中有一个函数调用,并且该函数还有一些异步代码。现在的问题是 for 循环不会等待异步代码从嵌套函数调用返回并继续迭代。
函数aFunctionThatRunsAsync 来自我无法控制的库。
以下是所有代码。
// arr.length = 2
for (let i in arr) {
console.log(i, 'i1')
functionOne(arr[i], i, (err, res) => {
console.log(res)
})
}
function functionOne(inp, idx, callback) {
console.log(idx, 'i1')
const processor = aFunctionThatRunsAsync(inp, err => {
if (err) return callback(err);
});
processor.on('complete', data => {
console.log(data, idx, 'i3')
return callback(null, data)
});
}
问题:
代码执行后的日志是这样的:
0 i1 // expected 0 i2 // expected 1 i1 // unexpected, expected to have logged: data(obj) i3 1 i2 // unexpected, expected to have logged: 1 i1
最后记录:
data(obj) 0 i3 data(obj) 1 i3 // Not always in the same order
我希望 for 循环等待异步代码返回/记录并以正确的顺序同步运行,因此最终输出如下所示:
0 i1 0 i2 data(obj) 0 i3 1 i1 1 i2 data(obj) 1 i3
【问题讨论】:
-
const processor = aFunctionThatReturnsAPromise(/*...*);然后processor.on('complete', ...这对我来说不像是承诺。 -
抱歉,如果我使用了不正确的术语。我所知道的是这个函数是异步工作的。我已经编辑了问题以传达相同的内容。
-
您的问题与此处描述的问题相对应:stackoverflow.com/questions/11488014/…
-
“现在的问题是 for 循环不会等待异步代码返回” - 请不要说您对此感到惊讶……这就是异步意味着。
-
我实际上根本不希望代码以异步方式运行,它只是强制执行该行为的第 3 方库。
标签: javascript node.js