我有以下承诺:
const promise = new Promise((resolve,reject) => {
setTimeout(()=> { resolve('Hello')},4000);
});
后来,我这样称呼它:
promise.then((msg) => {console.log(msg)});
由于超时,我原以为在调用 then
后 4 秒会显示“Hello”消息,但实际上它是立即显示的...
我肯定遗漏了什么:什么?
答案 0 :(得分:4)
我这样称呼它
您不会“调用”承诺。它不是一个函数(尽管它确实有方法)。从问题中我了解到您做了第一部分 (const promise = new Promise(/*...*/);
),然后 稍后 做了第二部分 (promise.then(/*...*/);
),并且您希望计时器在您做了then
,而不是你做new Promise
的时候。
但是 Promise 的工作方式是,您的计时器在您执行 new Promise
时启动,而不是在您调用 then
时启动。您传递给 new Promise
(promise executor 函数)的函数被同步和立即调用。其目的是启动promise要报告完成的操作。
这可能有助于使其更加清晰:
const start = Date.now();
function log(msg) {
const elapsed = String(Date.now() - start).padStart(4, " ");
console.log(`${elapsed}: ${msg}`);
}
log("A");
const promise = new Promise((resolve, reject) => {
log("B: Starting 5000ms timer");
setTimeout(() => {
resolve("Hello");
}, 5000);
log("C");
});
log("D: Waiting 2000ms before calling `then`");
setTimeout(() => {
log("F: Calling `then`");
promise.then((msg) => {
log("G");
log(msg)
});
}, 2000);
log("E");
注意输出是
0: A
1: B: Starting 5000ms timer
2: C
2: D: Waiting 2000ms before calling `then`
2: E
然后大约两秒钟后:
2002: F: Calling `then`
然后大约三秒后(自开始后五秒)
5002: G
5004: Hello
注意事项:
then
都没有关系。我等了 2 秒才调用 then
,但在 总共 5(不是 7)秒后仍然收到了执行回调我上面描述的是 Promise 的标准行为。有(不幸的是,在我看来)有少量类似 Promise 的东西,它们的行为略有不同,它们确实在开始它们的过程之前等待对 then
的第一次调用。这些不典型,但遗憾的是它们确实存在。