你能帮助理解在父类的回调中使用promises然后尝试在子类上设置属性时可能出现什么问题吗?
我正在使用nodejs v8.2.1
以下是基类的示例:
class CGLBase extends CAuthClient
{
constructor(req, res)
{
return new Promise(resolve => {
super(req, res, (authClient) => {
this.setAuthClient(authClient);
resolve(this);
});
});
}
setAuthClient(authClient)
{
//setting authClient (this.auth will contain property)
}
}
这里是儿童班的例子:
class СSheet extends CGLBase
{
constructor(document, urlRequest, urlResponse)
{
super(urlRequest, urlResponse);
this.document = document;
this.someAnotherProp = "some property";
//etc..
}
someFunc()
{
//using this.document and this.auth
}
}
之后我正在创建СSheet的实例并尝试设置属性:
var document = { ... }; //here I create object
(async () => {
var docSheet = await new СSheet (document, req, res);
docSheet.someFunc();
console.log(docSheet.auth); //return correct property
console.log(docSheet.document); //return undefined. why...
})();
所以,我不明白为什么没有设置属性 this.document 。我只看到在异步回调中设置的 this.auth 。 除this.auth 以外的所有属性都是未定义。
我将非常感谢您的建议或帮助。
提前谢谢。
答案 0 :(得分:0)
我不明白为什么没有设置属性this.document。我只看到在异步回调中设置的this.auth。
您的CSheet
构造函数确实在document
返回的承诺上设置了someAnotherProp
和super()
属性。 await
new CSheet
为您提供了承诺已解决的CAuthClient
实例,以及没有属性的实例。
你可以使用
来解决这个问题class СSheet extends CGLBase {
constructor(document, urlRequest, urlResponse) {
return super(urlRequest, urlResponse).then(instance => {
instance.document = document;
instance.someAnotherProp = "some property";
// …
return instance;
});
}
…
}
但是你really absolutely never should do that。这当然是CAuthClient
进行异步回调的错误。修复该类及其所有子类在静态助手方法中进行authClient
的异步创建,并仅将普通值传递给构造函数。