蓝鸟覆盖构造函数

Bluebird overwriting constructor

我目前正在编写我的 promise 链,并且遇到了一个关于 Bluebird 的奇怪问题。使用 babel-node 和 ES6,我正在尝试创建一个不需要我必须做 .then(function() { return foo(); }); 而是 .then(foo) 的承诺链。问题是当以较短的形式调用函数时,我的构造函数中的数据被删除。

这是一个简单的例子。

import Promise from 'bluebird';

class TestClass {
  constructor() {
    this.my_var = 'Hello!';
  }

  startOne() {
    var self = this;
    return this.wait()
      .then(function() { return self.myself(); });
  }

  startTwo() {
    return this.wait().then(this.myself);
  }

  wait() {
    return Promise.delay(1000);
  }

  myself() {
    if (!this) return console.log('I\'m not feeling like myself today...');
    console.log(this);
  }
}


var foo = new TestClass();
foo.startOne();
foo.startTwo();

当调用 foo.startOne() 时,使用较长版本的链,它正确地 returns {my_var: 'Hello'}。然而,当 foo.startTwo() 被调用时, thisundefined.

这是为什么?我如何错误地编写我的链,使 this 变得未定义?或者它真的应该像第一个例子那样写吗?

谢谢。

这是传递函数引用的常规 Javascript 问题(与承诺无关)。

当您将 this.myself 作为函数参数传递时,实际传递的只是对 myself 函数的引用,并且与 this 对象的绑定会丢失,因此当调用函数时,this 指针将是错误的,不会指向对象的实例数据。有很多方法可以解决这个问题。这是传递作为方法的回调函数的一般 Javascript 问题。有多种方法可以解决此问题。

您可以使用 .bind() 来保持 this 引用 属性 的附加,如下所示:

 return this.wait().then(this.myself.bind(this));