gpt4 book ai didi

javascript - 为什么我的异步函数在早先的 promise 被履行之前被执行?

转载 作者:行者123 更新时间:2023-12-01 15:23:55 24 4
gpt4 key购买 nike

我编写了一个小程序来比较 .then() 之间的 promise 履行情况。方法和async/await方法。代码运行正常,但是以意外的顺序接收输出。有人可以解释为什么输出是当前顺序吗?

const backend = (num) => {
const someVar = new Promise((resolve, reject) => {
if (num % 2 === 0) {
resolve(`The number, ${num}, is even.`);
} else {
reject(`The number, ${num}, is odd.`);
}
})
return someVar;
}
const builtInFuncs = (num) => {
backend(num)
.then(message => console.log(message))
.catch(message => console.log(message));
}
const asyncAwait = async(num) => {
try {
const response = await backend(num);
console.log(response);
} catch (error) {
console.log(error);
}
}

builtInFuncs(2);
builtInFuncs(3);

asyncAwait(4);
asyncAwait(5);

我期望的输出是:
The number, 2, is even.
The number, 3, is odd.
The number, 4, is even.
The number, 5, is odd.
我收到的输出是:
The number, 2, is even.
The number, 4, is even.
The number, 5, is odd.
The number, 3, is odd.

最佳答案

对于微任务解析,每个方法调用都单独排队。所以执行顺序是这样的:

  • 第一次通话入队
  • 第二次通话入队
  • 第三次通话入队
  • 第四次调用入队
  • .then火灾,console.logged。
  • 第二.then火灾,拒绝,.catch处理程序入队(未调用)。
  • 调用 async/await,console.logged
  • 第二次调用 async/await,拒绝,catch block 入队。
  • .catch解决,console.logged。
  • catch block 解析,最终日志。

  • 在评论中向 Barmar 提出关于切换 catch 顺序的想法的建议。
    为了更简单地说明(清楚吗?),考虑一个计数器和一个 Promise 函数,它先递增然后递减:
    let i = 0;
    const log = Promise.resolve()
    .then(() => console.log(++i))
    .then(() => console.log(--i));

    log();
    log();
    这将打印 1 2 1 0 而不是 1 0 1 0。如果您考虑一下,这有一定的意义:方法链可能在任何步骤失败,因此运行时将第一个调用和第二个 .then 排入队列仅在第一次完成后才入队。否则,如果第一次调用失败(被拒绝),它将不得不返回并从回调队列中删除推测性排队的第二次调用。

    关于javascript - 为什么我的异步函数在早先的 promise 被履行之前被执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62684024/

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