蓝鸟覆盖构造函数

时间:2015-09-02 19:54:22

标签: javascript ecmascript-6 bluebird

我目前正在撰写我的承诺链,并且遇到了与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()时,正在使用较长版本的链,它会正确返回{my_var: 'Hello'}。但是,在调用foo.startTwo()时,thisundefined

为什么?如何错误地编写我的链this变得不确定?或者它真的应该像第一个例子一样写出来?

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个常规的Javascript问题,它传递了一个函数引用(没有特定于promises的内容)。

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

您可以使用.bind()保留this引用属性,如下所示:

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