【问题标题】:asynchronous functions not executing sequentially as it should be异步函数没有按应有的顺序执行
【发布时间】:2020-01-23 18:11:33
【问题描述】:

我的代码行为怪异。这是一个 sn-p 及其输出:

  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”是如何记录的,这很奇怪?

仅供参考:我正在使用蓝鸟。

【问题讨论】:

  • 你可能需要在内部回调中return Promise.each(...),否则它可能无法链接它。
  • @sp00m 哇,解决了。您介意通过返回 Promise.each(...) 来解释它是如何解决的吗

标签: javascript node.js asynchronous promise


【解决方案1】:

如果你没有正确链接你的承诺,假设两个承诺都需要 1 秒的时间来执行:

somePromise.then(() => {
    // 1.
    someOtherPromise.then(() => {
        // 3.
        console.log("inner");
    });
}).then(() => {
    // 2.
    console.log("outer");
});

首先,1. 将在 t+1s 之后发生。然后它触发someOtherPromise,但不等待它,所以1.“同步”完成,导致2.被执行(在t+1s+Ɛns)。在 t+2s,3. 被执行。如果您确实等待另一个承诺:

somePromise.then(() => {
    // 1.
    return someOtherPromise.then(() => {
        // 2.
        console.log("inner");
    });
}).then(() => {
    // 3.
    console.log("outer");
});

首先,1. 将在 t+1s 之后发生。然后它会触发someOtherPromise,但它会等待它:3. 只有在返回的 promise 被解决后才会被调用。所以2.出现在t+2s,然后3.出现在t+2s+Ɛns。

附注:在函数世界中,您通常有 .map.flatMap,但 JS Promise 的 .then 混合了这两者,这取决于动态类型的回调返回什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多