我有以下承诺:
const promise = new Promise((resolve,reject) => {
setTimeout(()=> { resolve('Hello')},4000);
});
后来,我这样称呼它:
promise.then((msg) => {console.log(msg)});
我期望在呼叫后 4 秒显示“Hello”消息then
由于超时,但实际上立即显示...
我肯定缺少一些东西:什么?
我这样称呼它
你不会“呼唤”一个承诺。它不是一个函数(尽管它确实有方法)。从问题中我了解到你做了第一部分(const promise = new Promise(/*...*/);
), 进而later做了第二部分(promise.then(/*...*/);
),并且您希望计时器在您启动时启动then
,不是当你这样做的时候new Promise
.
但 Promise 的工作方式是,当你这样做时,你的计时器就开始了new Promise
,稍后当你打电话时then
。你传入的函数new Promise
(the 承诺执行人函数)被调用同步地 and 立即地。其目的是启动 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
注意事项:
- Promise 执行器立即同步运行,并启动其 5 秒计时器
- 当你打电话时并不重要
then
。我等着打电话then
2秒,但仍然得到了执行回调total5(不是 7)秒
我上面描述的是 Promise 的标准行为。有(不幸的是,在我看来)有少量类似承诺的东西,其行为略有不同,do等待第一个电话then
在他们开始他们的过程之前。那些是不典型,但遗憾的是它们确实存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)