我想在我的第二个承诺中引用一个类属性。但是,在类函数pTwo中,'this'是未定义的。我知道我处于承诺范围内,我如何访问PromiseChain实例范围?
使用ES6和本机承诺。
class PromiseChain {
constructor(){
this.food = 'Pasta';
this.type = 'Italian';
}
pOne() {
console.log('pOne');
return Promise.resolve();
}
pTwo() {
console.log('pTwo');
try {
console.log(this.food);
} catch (e) {
// can't read 'food' of undefined!
console.log(e);
}
return Promise.reject()
}
work() {
console.log('Get to work!');
this.pOne().then(this.pTwo).catch((error) => {
console.log(error);
})
}
}
new PromiseChain().work();
答案 0 :(得分:5)
这很简单,您需要将pTwo
的调用绑定到正确的范围,在Javascript中我们可以使用bind()
方法执行此操作。
因此:
this.pOne().then(this.pTwo.bind(this)).catch((error) => {
将您对pTwo的调用绑定到正确的范围,从而产生:
Get to work!
pOne
pTwo
Pasta
undefined
待印;如果你想让最后一个undefined返回一些内容,请在reject参数中传递一条消息。
如果您不希望使用大量.bind(this)
混乱代码库,则可以在当前范围内明确设置对this
的引用,并将其作为参数传递给您的每个承诺;在你的情况下,work
方法声明:
work() {
var that = this;
console.log('Get to work!');
this.pOne().then(this.pTwo(that).catch((error) => {
console.log(error);
}));
}
请注意,现在pTwo
接受that
的参数,现在pTwo
内部我们可以执行以下操作:
pTwo(parentScope) {
console.log('pTwo');
try {
console.log(parentScope.food);
} catch (e) {
// can't read 'food' of undefined!
console.log(e);
}
return Promise.reject()
}
请注意,我们传递参数parentScope
,这允许我们引用正确的范围。