【发布时间】:2020-02-12 20:58:11
【问题描述】:
我正在努力处理涉及一组承诺中的闭包的代码块。这个例子说明了这个问题。问题是让这三个 Promise 示例中的最后一个在 q 上关闭并使用 Promise 的结果。前两个有效,似乎是因为 Promise 的成功处理程序只是没有任何其他参数的闭包函数,这意味着 Promise 的结果没有作为参数显式传递。第三个 promise 的成功函数尝试传递结果对象的属性,但这导致q 上没有闭包。目标是让q 是 5 而不是 7。我很抱歉,因为我确信我使用了所有错误的编码术语。
你能解释一下我错过了什么吗?谢谢。
let q = 1;
let f = (function (x) {
return function (r) {
result(x, r);
}
})(q);
q = 5;
promise_test().then((r) => {
f(r);
}, () => { });
promise_test().then((function (x) {
return function (r) {
result(x, r);
}
})(q), () => { });
promise_test_obj().then((o) => (function (x) {
return function (r) {
result(x, r);
}
})(q)(o.m), () => { });
q = 7;
function promise_test() {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve('promise test resolved');
}, 100);
});
}
function promise_test_obj() {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve({ 'm': 'promise test_obj resolved' });
}, 100);
});
}
function result(a, r) {
console.log('q : ' + a + ', r : ' + r);
}
【问题讨论】:
-
哇,你真的应该清理你的代码格式。我希望这只是在此处发布时的一个问题,而不是您的实际来源。
-
@Gary 使用一些比单个字母更好的变量名对阅读您的代码更有帮助。照原样,它非常难以解析。
-
@Gary 没关系,以后只需粘贴您拥有的内容,然后单击
tidy按钮。在@Geuis 帮助进行格式化时,我将尝试破译这里发生的事情,但请也接受他对变量和函数名称的建议。 -
对不起,我试过了,但我不明白这应该做什么,而且遵循逻辑至少很难说。如果您可以使用更清晰的变量和函数名称更新您的 sn-p,我可以再破解一次。如果您进行这些更新并希望我再看一下,请@我。
-
我认为 success 函数直到 promise 解决后才会处理,因此 promise 中设置的闭包直到 q 的值改变后才会发生。在前两个 Promise 中,闭包是在 Promise 解决之前设置的。
标签: javascript promise closures