我目前正在撰写我的承诺链,并且遇到了与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()
时,this
为undefined
。
为什么?如何错误地编写我的链this
变得不确定?或者它真的应该像第一个例子一样写出来?
感谢。
答案 0 :(得分:0)
这是一个常规的Javascript问题,它传递了一个函数引用(没有特定于promises的内容)。
当您将this.myself
作为函数参数传递时,实际传递的所有内容都是对myself
函数的引用,并且对this
对象的绑定将丢失,因此当函数为调用时,this
指针将出错,并且不会指向对象的实例数据。有很多方法可以解决这个问题。这是一个通用的Javascript问题,它传递回调函数是方法。有很多方法可以解决这个问题。
您可以使用.bind()
保留this
引用属性,如下所示:
return this.wait().then(this.myself.bind(this));