【发布时间】:2020-04-23 08:13:09
【问题描述】:
我有一个类似下面的函数
function async populateInventories(custID){
this.inventories = await this.inventoryService.getCustomerInventories(custID)
//do some stuff with Inventories
// another await
}
我的问题是我需要取消一个正在进行的等待请求,并像使用订阅一样发送一个新鲜的等待请求。
以前我的功能如下所示,我可以取消以前的订阅:
function async populateInventories(custID){
let invetroySubscription$;
if(invetroySubscription$!==undefined){
invetroySubscription$.unsubscribe();
}
invetroySubscription$=this.inventoryService.getCustomerInventories(custID).subscribe((data:any)=>{
this.inventories = data.response;
//do some stuff with Inventories
// another subscription here -- I was told this way of doing is wrong
})
}
使用 async/await 我能够按顺序处理任何操作,这真的很棒,而且代码可读性非常好,我无法使用订阅来实现,但是 async/await 有它们自己的缺点。
我可以一次停止多次调用 populateInventories 以避免我的问题,但我正在寻找是否可以为我的问题找到更多解决方案(整洁)。
PS:我读到在订阅调用或嵌套订阅中调用另一个订阅不是一个好习惯。
【问题讨论】:
-
看起来
.getCustomerInventories(custID)没有返回承诺。它(同步地)返回一个可以订阅的类流对象。因此,等待getCustomerInventories不会改进您的原始代码。事实上,等待它并将结果视为您的数据(而不是获取您的数据的流)几乎肯定是一个错误。 -
从你试图实现的目标来看,你的异步逻辑是错误的。你不去等待一个新的承诺,你改变承诺逻辑以满足额外/新的请求,即你更新
inventoryService.getCustomerInventories实现,这样它就可以在内部刷新请求,链接到它返回的承诺。
标签: javascript async-await angular6 es6-promise