Javascript 为什么在解析异步调用之前返回值,即使在使用async/await时也是如此?
以下函数在this.codesService.getCostCodes解析之前返回承诺,导致未定义Javascript 为什么在解析异步调用之前返回值,即使在使用async/await时也是如此?,javascript,typescript,asynchronous,Javascript,Typescript,Asynchronous,以下函数在this.codesService.getCostCodes解析之前返回承诺,导致未定义 async getTopParentByChildId(id: string) { let parent; await this.codesService.getCostCodes().subscribe( data => { parent = data.body[0]; }); return new Promise<BidItem&
async getTopParentByChildId(id: string) {
let parent;
await this.codesService.getCostCodes().subscribe( data => {
parent = data.body[0];
});
return new Promise<BidItem>(resolve => { //returning `parent` results in the same issue
resolve(parent);
});
}
我读过很多关于async/await和Promissions的书,但到目前为止,我尝试过的解决方案都不适用于我。当我使用async/await关键字时,我无法理解为什么它不等待异步函数解析。您可以等待承诺,就是这样。你不能等待一个rxjs订阅,甚至是一个RXJSObservable,这会让你有更多的理由去尝试,但仍然不起作用
您可以重构gettopparentbychildie,从而删除异步/等待,因为它们不是必需的
getTopParentByChildId(id: string) {
return this.codesService.getCostCodes()
.pipe(map(data => data.body[0]))
.toPromise();
}
您可以重构PopulateBiItemObjectArray以实现此目的
你可以等待承诺,就是这样。你不能等待rxjs订阅,甚至是rxjs observable,这样做会更有意义。在这里使用新承诺没有任何意义。您可能希望执行return Promise.resolveparent,但即使这样也没有必要-在异步函数中,您可以只编写return parent;。
getTopParentByChildId(id: string) {
return this.codesService.getCostCodes()
.pipe(map(data => data.body[0]))
.toPromise();
}
populateBidItemObjectArray(node) {
return this.getTopParentByChildId(node.id)
.then(_ => {
return {
name: _.name,
id: _.id
};
});
}