gpt4 book ai didi

JavaScript promise : can a parameter passed to fulfill go out of scope?

转载 作者:行者123 更新时间:2023-12-03 05:13:28 25 4
gpt4 key购买 nike

我正在关注有关 Promise 的 javascript 教程,here ,特别是这段代码(模拟骰子的 throw ):

function dieToss() {
return Math.floor(Math.random() * 6) + 1;
}

function tossASix() {
return new Promise(function(fulfill, reject) {
var n = Math.floor(Math.random() * 6) + 1;
if (n === 6) {
fulfill(n);
} else {
reject(n);
}
});
}

function logAndTossAgain(toss) {
console.log("Tossed a " + toss + ", need to try again.");
return tossASix();
}

function logSuccess(toss) {
console.log("Yay, managed to toss a " + toss + ".");
}

function logFailure(toss) {
console.log("Tossed a " + toss + ". Too bad, couldn't roll a six");
}

tossASix()
.then(null, logAndTossAgain) //Roll first time
.then(null, logAndTossAgain) //Roll second time
.then(logSuccess, logFailure); //Roll third and last time

我认为它在做什么很清楚,但是,作为测试,我将最后几行改为此

tossASix()
.then(logSuccess, logAndTossAgain) //Roll first time
.then(logSuccess, logAndTossAgain) //Roll second time
.then(logSuccess, logFailure); //Roll third and last time

如果我正确理解了 Promise(请耐心等待,因为我仍在努力理解它们)我会认为当我第一次抛出 6 时,输出将是

Yay, managed to toss a 6.
Yay, managed to toss a 6.
Yay, managed to toss a 6.

但事实上我得到的是

Yay, managed to toss a 6.
Yay, managed to toss a undefined.
Yay, managed to toss a undefined.

这是为什么呢?这是否意味着在第一次调用 logSuccess (即完成)后参数 n 超出范围?如果是这样为什么?这与 promise 只兑现一次、仅此而已有什么关系吗?

最佳答案

then 接受两个参数:第一个是 resolve 回调,第二个是 reject 回调,并返回一个新的 Promise

由于您在第一次调用 tossASix 时得到了 6,因此它不会调用 logAndTossAgain,因为您将其作为 reject 传递 回调并继续记录 undefined 值,因为作为 resolve 提供的函数 logSuccess 不会返回任何内容。

您可以阅读有关 promise 链的更多信息 here .

关于JavaScript promise : can a parameter passed to fulfill go out of scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41699046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com