等待promise setTimout工作不对?[复制]

Await promise setTimout is working wrong? [duplicate]

提问人:Aminarune 提问时间:10/1/2023 更新时间:10/1/2023 访问量:44

问:

该函数假设在 6 秒后结束,但在运行时只花了 4 秒main

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("promise1");
    resolve("promise1");
  }, 4000);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("promise2");
    resolve("promise2");
  }, 2000);
});

async function main() {
  const result1 = await promise1;
  const result2 = await promise2;
  console.log("end");
}

main();

当我查看终端时,我注意到输出然后.代码是否应该先运行 promise 1 然后运行 promise 2?promise2promise1

你能帮忙解释一下为什么,在这种情况下有什么方法可以等待应许吗?

javascript 异步 await es6-promise

评论

0赞 jabaa 10/1/2023
它们同时开始。在第一个 promise 解析后启动第二个超时
0赞 Aminarune 10/1/2023
@jabaa,既然 await 关键字应该阻止 promise2 执行,直到 promise1 被解析,它们怎么能开始呢?

答:

4赞 Quentin 10/1/2023 #1

立即调用传递给的函数。它不是由 触发的。new Promiseawait

关键字只是暂停函数,直到解析其 RHS 上的 promise。awaitmain

  1. 您创建了第一个承诺
  2. 您创建了第二个应许
  3. 你调用main
  4. main被暂停,直到解决promise1
  5. 两秒钟后解决promise2
  6. 两秒钟后解决promise1
  7. main醒来
  8. main被挂起,直到在步骤 5 中已经发生解决,因此它会立即再次唤醒promise2

如果你想避免调用你传递给第二个的函数,直到第一个 promise 解析,那么把它放在一个函数中,从你想调用它的时候可以调用它setTimeoutmain

const func1 = () => new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("promise1");
    resolve("promise1");
  }, 4000);
});

const func2 = () => new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log("promise2");
    resolve("promise2");
  }, 2000);
});

async function main() {
  const result1 = await func1();
  const result2 = await func2();
  console.log("end");
}

main();