gpt4 book ai didi

javascript - 异步函数没有按应有的顺序执行

转载 作者:行者123 更新时间:2023-12-03 16:40:45 27 4
gpt4 key购买 nike

我的代码运行异常。这是一个片段及其输出:

  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/

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