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));

这会导致 setTimeoutstring 变量中获取 当前 的参数,该行是 运行 -虽然 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);
});