Javascript: Promises + this

16 浏览
0 Comments

Javascript: Promises + this

这个问题在这里已经有了答案:

“this”关键字如何工作,什么时候应该使用?

考虑以下代码:

foo: function() {
  var self = this;
  var p1 = p2 = someFunctionThatReturnsAPromise();
  Promise.all([p1, p2])
    .then(self.bar);
}
bar: function(promises) {
  var self = this;
  console.log(self);
}

输出:

undefined

但如果我做以下更改:

foo: function() {
  var self = this;
  var p1 = p2 = someFunctionThatReturnsAPromise();
  Promise.all([p1, p2])
    .then(function(result) {
      self.bar(result);
    });
}
bar: function(promises) {
  var self = this;
  console.log(self);
}

输出:

{ foo: [Function],
  bar: [Function] }

我不明白为什么在bar函数中第一次调用会更改this指向的位置。有人可以为我解释吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

当您将self.bar传递给then方法时,您传递了一个函数引用。尽管看起来您还指定它应该在self对象上调用,但实际上并非如此。self对象不包括在该函数引用中。函数的this对象的值是在调用函数时确定的,而不是在定义或传递参数时确定的。\n\n在您的第二个示例中,self是函数上下文中的this对象,因为您是在该上下文中调用函数的。\n\n另一种使其工作的方法是强制函数的this对象始终为self,覆盖上述描述的行为。您可以使用.bind()实现这一点:\n\n

Promise.all([p1, p2])
    .then(self.bar.bind(self));

0