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

标签 javascript node.js asynchronous promise

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

  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/

相关文章:

javascript - 使 <img> 元素出现在悬停时并保持在与被点击按钮的相同 ID 相对应的点击上

javascript - Ng-repeat 切换,初始状态显示第一个子项并隐藏其余项

javascript - Function "overruns"执行期间的if-else语句

node.js - 重启时Nodemon不执行命令

javascript - 从 Laravel 外部推送到 Laravel 队列(NodeJS)

javascript - 在 Excel 用户定义函数中运行 node.js 代码

c# - 使用委托(delegate)时 CPU 百分比高

javascript - 如何从 JavaScript 中的字符串中删除 div 和 span 以外的 HTML 标记?

ios - 完成处理程序和返回值

javascript - 异步构建一个数组,迭代其他数组