Closure on Promise 不能处理异步影响的值吗?
Doesn't Closure on Promise Work With Asynchronously Affected Value?
在第二个 then 方法上有一个关闭值(字符串),我 运行 setTimeout 在 1 秒后更改它。
此外,我将返回新的 Promise 以在 2 秒后使用 setTimeout 解决我用之前的 setTimeout 更改的值。
但是在 next then 方法解决之后,它会注销不受先前 setTimeout 影响的值。
我不应该从最后一个 then 方法的日志中得到 'foobarbaz' 吗?
提前致谢...
var p1 = new Promise((resolve, reject) => {
resolve('foo');
});
p1.then(function(string) {
return new Promise(res => {
setTimeout(() => {
string += 'bar';
res(string);
}, 2000);
});
})
.then(function(string) {
setTimeout(function() {
string += 'baz';
console.log(string);
}, 1000);
return new Promise(resolve => setTimeout(resolve, 2000, string));
})
.then(function(string) {
console.log(string);
});
问题是:
return new Promise(resolve => setTimeout(resolve, 2000, string));
这会导致 setTimeout
在 string
变量中获取 当前 的参数,该行是 运行 -虽然 string
在上层 setTimeout
中被重新分配,但 setTimeout
还没有 运行,所以 string
仍然是 foobar
.
类似地:
let a = 'foo';
setTimeout(console.log, 200, a);
a = 'bar';
导致 foo
被记录,而不是 bar
。
如果您传递一个函数,该函数在调用时引用 string
绑定到 调用所述函数时 ,结果将如预期:
return new Promise(resolve => setTimeout(() => {
resolve(string);
}, 2000));
var p1 = new Promise((resolve, reject) => {
resolve('foo');
});
p1.then(function(string) {
return new Promise(res => {
setTimeout(() => {
string += 'bar';
res(string);
}, 2000);
});
})
.then(function(string) {
setTimeout(function() {
string += 'baz';
console.log(string);
}, 1000);
return new Promise(resolve => setTimeout(() => {
resolve(string);
}, 2000));
})
.then(function(string) {
console.log(string);
});
在第二个 then 方法上有一个关闭值(字符串),我 运行 setTimeout 在 1 秒后更改它。 此外,我将返回新的 Promise 以在 2 秒后使用 setTimeout 解决我用之前的 setTimeout 更改的值。 但是在 next then 方法解决之后,它会注销不受先前 setTimeout 影响的值。 我不应该从最后一个 then 方法的日志中得到 'foobarbaz' 吗?
提前致谢...
var p1 = new Promise((resolve, reject) => {
resolve('foo');
});
p1.then(function(string) {
return new Promise(res => {
setTimeout(() => {
string += 'bar';
res(string);
}, 2000);
});
})
.then(function(string) {
setTimeout(function() {
string += 'baz';
console.log(string);
}, 1000);
return new Promise(resolve => setTimeout(resolve, 2000, string));
})
.then(function(string) {
console.log(string);
});
问题是:
return new Promise(resolve => setTimeout(resolve, 2000, string));
这会导致 setTimeout
在 string
变量中获取 当前 的参数,该行是 运行 -虽然 string
在上层 setTimeout
中被重新分配,但 setTimeout
还没有 运行,所以 string
仍然是 foobar
.
类似地:
let a = 'foo';
setTimeout(console.log, 200, a);
a = 'bar';
导致 foo
被记录,而不是 bar
。
如果您传递一个函数,该函数在调用时引用 string
绑定到 调用所述函数时 ,结果将如预期:
return new Promise(resolve => setTimeout(() => {
resolve(string);
}, 2000));
var p1 = new Promise((resolve, reject) => {
resolve('foo');
});
p1.then(function(string) {
return new Promise(res => {
setTimeout(() => {
string += 'bar';
res(string);
}, 2000);
});
})
.then(function(string) {
setTimeout(function() {
string += 'baz';
console.log(string);
}, 1000);
return new Promise(resolve => setTimeout(() => {
resolve(string);
}, 2000));
})
.then(function(string) {
console.log(string);
});