【问题标题】:How to wait for the result from a for loop in Typescript?如何等待 Typescript 中 for 循环的结果?
【发布时间】:2021-10-30 13:26:03
【问题描述】:

我在打字稿中有一个 for 循环。循环的返回结果将用作另一个方法的参数。无论我如何尝试,我的代码总是在循环结束之前返回一个结果。应该设置多长的等待时间才能在循环结束后得到返回结果?或者任何其他解决方案将不胜感激。

private async findMainItemId() {
    let mainItem = {id: 1, price: 0};
    mainItem.id = this.itemIds[0];
    
    for (let i = 0; i <= this.itemIds.length; i ++)
    {      
      this.checkoutService.getShippingFees(this.itemIds[i]).subscribe((resp: IDeliveryType[]) => {
        let itemDeliveryTypes = resp.filter(s => s.applied === true);
        let standardPrice = itemDeliveryTypes.find(dt => dt.name === 'standard').price;
          
        if ( standardPrice > mainItem.price) 
        {
          mainItem.id = this.itemIds[i].id;
          mainItem.price = standardPrice;
        };  
      })
    } 
    return mainItem.id;
  }  

【问题讨论】:

  • 试过在调用这个方法的代码中使用await?这个方法中的subscribe方法需要await吗?

标签: angular typescript for-loop async-await


【解决方案1】:

如果 subscribe 没有返回 Promise,您可以手动将回调包装在 Promise 构造函数中,以便您可以 await 它。

private async findMainItemId() {
  const mainItem = {id: 1, price: 0};
  mainItem.id = this.itemIds[0];
    
  for (const item of this.itemIds) {
    await new Promise(resolve =>
      this.checkoutService.getShippingFees(item).subscribe((resp: IDeliveryType[]) => {
        const itemDeliveryTypes = resp.filter(s => s.applied);
        const standardPrice = itemDeliveryTypes.find(dt => dt.name === 'standard').price;
          
        if (standardPrice > mainItem.price) {
          mainItem.id = item.id;
          mainItem.price = standardPrice;
        };
        resolve();
      })
    );
  } 
  return mainItem.id;
}  

【讨论】:

  • 该解决方案绝对有效!非常感谢石心!
  • 很高兴该解决方案有所帮助!
猜你喜欢
  • 2021-06-17
  • 2021-08-09
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 2018-06-09
相关资源
最近更新 更多