Javascript Promise.race

问题描述 投票:0回答:1

在 setTimeout 外部和 setTimeout 内部的 getStates() 函数中,promise(p1, p2, p3) 的执行方式有何不同

const p1 = new Promise((res) => setTimeout(() => res(100), 100));
const p2 = new Promise((res) => setTimeout(() => res(200), 200));
const p3 = new Promise((res, rej) => setTimeout(() => rej(300), 100));

async function getStates() {
  console.log(await promiseState(p1));
  console.log(await promiseState(p2));
  console.log(await promiseState(p3));
}

console.log("Immediately after initiation:");
getStates();
setTimeout(() => {
  console.log("After waiting for 100ms:");
  getStates();
}, 100);

我从 mdn 的promise.race Exmaple

获取了它

我认为所有 Promises 都应该返回pendingState对象,但 setTimeout 函数中并非如此

javascript promise
1个回答
1
投票

当您创建承诺时,计时器就会启动。在

new Promise
返回承诺之前,您传递的函数 new Promise 会被称为
同步
。它的工作是开始工作。

然后您立即检查承诺状态,因此它们都将处于待处理状态。

然后您等待 100 毫秒并再次检查。您的两个 Promise 计划在 100 毫秒后由计时器解决,因此这将首先发生,您将看到结果

p1
已履行,而
p3
被拒绝(并且
p2
仍处于活动状态,因为它的定时器设置为 200ms)。

关键是承诺计时器在您创建承诺时启动,而不是稍后。

© www.soinside.com 2019 - 2024. All rights reserved.