首页 > 解决方案 > 在 forEach 有条件的内部承诺完成后解决一个承诺

问题描述

我有以下跨越数组的承诺。根据数组项的值,可能会进行另一个调用。如果没有,什么都没有。它最终解决了一个对象。但问题是现在它早早地解决了。如果汽车的状态已知,则返回的数字很好。如果需要动态检测,它不会等待状态确定:

getAggregatedData(obj: StorageUnit): Promise<any> {
    let stat = {
      inStoreCars: 0,
      atWorkCars: 0
    };

    const vm: any = this;

    return new Promise((resolve, reject) => {
      obj.carsList.forEach(car => {

          if (car.inStore) {
            stat.inStoreCars++;
          } else if (car.atWork) {
            stat.atWorkCars++;
          }
          // unknown state. so check its state
          else {


                vm.carStateService
                  .getState(car)
                  .then(value => {
                   if (value == 1){
                       stat.inStoreCars++;
                   }else{
                       stat.atWorkCars++;
                   }
                  });


          }

      });
      resolve(stat) // returning too early before getState() resolves
    });
  }

然后我通常用

    getAggregatedData(car).then(stat=>{
       console.log(stat)
     });

标签: angulartypescript

解决方案


我有点需要更多信息,但在那些。拥有一个使一些异步内容同步的函数是一种反模式,因为事件循环是如何工作的。为什么你甚至需要承诺?如果您使用的是打字稿,为什么不异步等待。另一个反模式在同一个地方创建和执行承诺


推荐阅读