【发布时间】:2015-09-02 19:54:21
【问题描述】:
我目前正在编写我的承诺链,并且遇到了 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 变得未定义?还是真的应该像第一个例子那样写?
谢谢。
【问题讨论】:
-
这是一个基本的 JS 问题,如果您查看 stackoverflow.com/questions/3127429/…,第一个答案中的示例 #3 说明了您的问题。你正在做
var tmp = this.myself; tmp(),这使得this === undefined。由于您使用的是 ES6,请使用箭头函数,例如.then(() => this.myself())这样的问题经常被问到,我不知道该把它复制成什么。 -
@loganfsmyth:我们有一个专门用于 bluebird 承诺的 :-)
标签: javascript ecmascript-6 bluebird