是否可以将当前上下文(this
)传递给Promise解析器?它似乎在解析器内擦除。
示例:
class A {
constructor(someObject) {
this.someObject = someObject;
}
foo() {
return new Promise((resolve) => {
this.someObject.doAsyncRequest(arg, function(val) { resolve(val); });
});
}
}
编辑:
错误将是: “无法读取某些未定义的对象”
EDIT2: 抱歉,这确实有效。我在webpack中有一个错误,它在服务之前将一些随机垃圾插入文件中。
答案 0 :(得分:3)
这是一个更精简的版本,你的工作正常:
class A {
constructor() {
this.a = "hello";
}
foo() {
return new Promise(resolve => resolve(this.a));
}
}
const a = new A();
a.foo().then(a => console.log(a));

由于您在Promise
内使用了箭头功能,因此会保留this
上下文。
现在,如果您使用普通函数,则会丢失this
,因为它将变为未定义(请检查浏览器控制台,因为它会抛出错误而不显示):
class A {
constructor() {
this.a = "hello";
}
foo() {
return new Promise(function(resolve) { resolve(this.a) });
}
}
const a = new A();
a.foo().then(a => console.log(a));

如果你想用它维护上下文,你需要绑定它:
class A {
constructor() {
this.a = "hello";
}
foo() {
return new Promise((function(resolve) { resolve(this.a) }).bind(this));
}
}
const a = new A();
a.foo().then(a => console.log(a));

如果您使用foo()
作为回调,那也会丢失上下文(再次检查浏览器控制台,因为它会抛出错误):
class A {
constructor() {
this.a = "hello";
}
foo() {
return new Promise(resolve => resolve(this.a));
}
}
const a = new A();
const callback = a.foo;
callback().then(a => console.log(a));

要解决此问题,请在将其用作回调之前将其绑定:
class A {
constructor() {
this.a = "hello";
}
foo() {
return new Promise(resolve => resolve(this.a));
}
}
const a = new A();
const callback = a.foo.bind(a);
callback().then(a => console.log(a));