我的代码运行异常。这是一个片段及其输出:
let files = //files is an array
Promise.each(files, file => {
return epub.file(file.name).async('string').then(content => {
let mmls = //mmls is an array
Promise.each(mmls, mml => {
return mj.typeset({math: mml, format: 'MathML', svg: true}).then(mjdata => {
// do something
})
}).then(() => {
console.log(0)
})
})
}).then(() => {
console.log(1)
})
它将登录到控制台:
0
0
0
0
0
0
0
1
0 // one '0' after '1'
我发现很奇怪,如果已经记录了“1”,那么最后一个“0”是如何记录的?
仅供引用:我正在使用 bluebird 。
最佳答案
假设两个 promise 都需要 1 秒来执行,如果你没有正确地链接你的 promise:
somePromise.then(() => {
// 1.
someOtherPromise.then(() => {
// 3.
console.log("inner");
});
}).then(() => {
// 2.
console.log("outer");
});
首先,1.
将在 t+1 秒后发生。然后它会触发 someOtherPromise
,但不会等待它,因此 1.
“同步”完成,导致 2.
被执行(在t+1s+Ɛns)。在 t+2 秒,3.
被执行。如果你确实等待另一个 promise :
somePromise.then(() => {
// 1.
return someOtherPromise.then(() => {
// 2.
console.log("inner");
});
}).then(() => {
// 3.
console.log("outer");
});
首先,1.
将在 t+1 秒后发生。然后它会触发 someOtherPromise
,但它会等待它:3.
只会在返回的 promise 得到解决后才会被调用。所以 2.
出现在 t+2s,然后 3.
出现在 t+2s+Ɛns。
旁注:在函数式世界中,您通常有 .map
和 .flatMap
,但 JS Promise 的 .then
将两者混合,具体取决于由于动态类型,回调返回了什么。
关于javascript - 异步函数没有按应有的顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59875770/