蓝鸟覆盖构造函数
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()
被调用时, this
是 undefined
.
这是为什么?我如何错误地编写我的链,使 this
变得未定义?或者它真的应该像第一个例子那样写吗?
谢谢。
这是传递函数引用的常规 Javascript 问题(与承诺无关)。
当您将 this.myself
作为函数参数传递时,实际传递的只是对 myself
函数的引用,并且与 this
对象的绑定会丢失,因此当调用函数时,this
指针将是错误的,不会指向对象的实例数据。有很多方法可以解决这个问题。这是传递作为方法的回调函数的一般 Javascript 问题。有多种方法可以解决此问题。
您可以使用 .bind()
来保持 this
引用 属性 的附加,如下所示:
return this.wait().then(this.myself.bind(this));
我目前正在编写我的 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()
被调用时, this
是 undefined
.
这是为什么?我如何错误地编写我的链,使 this
变得未定义?或者它真的应该像第一个例子那样写吗?
谢谢。
这是传递函数引用的常规 Javascript 问题(与承诺无关)。
当您将 this.myself
作为函数参数传递时,实际传递的只是对 myself
函数的引用,并且与 this
对象的绑定会丢失,因此当调用函数时,this
指针将是错误的,不会指向对象的实例数据。有很多方法可以解决这个问题。这是传递作为方法的回调函数的一般 Javascript 问题。有多种方法可以解决此问题。
您可以使用 .bind()
来保持 this
引用 属性 的附加,如下所示:
return this.wait().then(this.myself.bind(this));