【发布时间】:2022-01-21 01:55:07
【问题描述】:
我有这样的功能:
async howLongToMyBirthdayDate(date) {
return await new Promise((resolve, reject) => {
let bday;
if (!(date instanceof Date)) {
if (Number.isInteger(date) && date > 0) {
bday = new Date(date);
} else {
setTimeout(() => reject(new Error('Wrong argument!')), 1000);
return;
}
} else {
bday = date;
}
const today = new Date();
today.setHours(0, 0, 0, 0);
bday.setFullYear(today.getFullYear());
bday.setHours(0, 0, 0, 0);
if (bday - today === 0) {
setTimeout(() => resolve(this.congratulateWithBirthday()), 1000);
}
setTimeout(
() =>
resolve(this.notifyWaitingTime(Math.ceil((bday - today) / 86400000))),
1000
);
});
}
承诺解决了两次。我看到函数 congratulateWithBirthday 和 notifyWaitingTime 的结果。正常吗?我认为承诺只能被解决或拒绝一次 - 通过第一次调用解决或拒绝回调。也许 setTimeout 会改变它的行为?谁能给我解释一下?
【问题讨论】:
-
“我看到了...的结果”。怎么看?为什么日期相同时调用 resolve() 两次?
-
"一个承诺可以解决两次吗?" — 不,但很难说发生了什么,因为您没有提供minimal reproducible example
-
“承诺解决了两次。” 你可能的意思是它实现了两次。 (更多关于术语in my post here。)但是一个承诺既不能被解决也不能被多次履行。如果您看到某件事让您认为它已经发生了两次,那么您看到的是其他事情的结果,而不是承诺的实现。
-
旁注:这里没有理由将任何日期逻辑与承诺混合在一起。算一算,如果你想延迟一秒报告结果,
awaitsetTimeoutwrapper。
标签: javascript asynchronous promise