我有一堂课,做一些非常复杂的事情。对于此示例,我将其简化为以下内容:
class MyClass {
constructor(name) {
this.name = name;
}
}
MyClass.prototype.sayName = function (cb) {
return this.getName(cb);
};
MyClass.prototype.getName = function (cb) {
setTimeout(() => {
console.log("My name is " + this.name);
cb();
}, 1000);
};
现在在此示例中当然不需要异步代码,但是在实际示例中,存在异步代码(例如,网络请求)。我只是简化了它,以使此问题变得更容易。另外,这个实际的类是3rd Party软件包的一部分,所以我对此没有任何控制。
无论如何,我有以下代码可以完美正常工作:
const myInstance = new MyClass("Bob");
myInstance.sayName(() => {
console.log("Done");
});
为了使代码中的代码更加一致,我正在尝试构建一个包装程序,将这些回调转换为promise:
const myInstance = new MyClass("Bob");
const standard = () => {
return getPromise(myInstance.sayName);
};
standard();
function getPromise(func) {
return new Promise(function(resolve, reject) {
func(function() {
resolve();
});
});
}
问题是。该代码不起作用。我收到以下错误:
(节点:58910)UnhandledPromiseRejectionWarning:TypeError:this.getName不是函数
在第二个示例sayName
的{{1}}方法内部看起来是在引用全局对象,而不是MyClass的实例。
为什么此代码不起作用?当我尝试在包装器中使用this
时为什么还有其他原因?