gpt4 book ai didi

javascript - 为什么即使使用 async/await,也会在异步调用解决之前返回值?

转载 作者:行者123 更新时间:2023-12-02 23:23:17 25 4
gpt4 key购买 nike

以下函数在 this.codesService.getCostCodes() 解析之前返回 Promise,导致未定义

  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);
});

}

getTopParentByChildId() 正在由另一个异步函数调用,该函数具有相同的问题,即在解析异步调用之前返回未定义:

  async populateBidItemObjectArray(node){
const parent = await this.getTopParentByChildId(node.id); //should wait for function to return before executing the rest

const bidItem = {
name: parent.name,
id: parent.id
};

return new Promise<BidItem>(resolve => { //returns undefined before this.getTopParentByChildId is resolved
resolve(parent);
});
}

我已经阅读了很多有关异步/等待和 promise 的内容,但到目前为止,我尝试过的解决方案都没有为我工作。我无法理解为什么当我使用 async/await 关键字时它不等待异步函数解析。

最佳答案

您可以等待一个Promise,仅此而已。你不能等待 rxjs 订阅(甚至不能等待 rxjs observable,尝试更有意义,但仍然行不通)。

您可以将 getTopParentByChildId 重构为此,从而删除不需要的 async/await。

getTopParentByChildId(id: string) {
return this.codesService.getCostCodes()
.pipe(map(data => data.body[0]))
.toPromise();
}

您可以将 populateBidItemObjectArray 重构为此。

populateBidItemObjectArray(node) {
return this.getTopParentByChildId(node.id)
.then(_ => {
return {
name: _.name,
id: _.id
};
});
}

关于javascript - 为什么即使使用 async/await,也会在异步调用解决之前返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56842199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com