在foreach内以角度4 /打字稿答应

时间:2019-04-23 00:37:30

标签: angular typescript angular4-httpclient

在foreach内兑现承诺的最佳方法是什么?

我有一个数组,需要将每个项目发送到RestFull API。 但是同时,我必须检查响应是否正确(我有一个计数器'errorSendPayment')。 在所有请求之后,我想知道是否发送一个布尔值或Promise错误(或者多个)。

如何改善代码?

public sendPaymentValues(sale: any, session: string): Promise<boolean> {
    const headers = this.getHeader();
    // counter
    let errorSendPayment = 0;

    sale.data.list.forEach(payment=> {
      this.http.post(`${api}payment/`, payment, headers)
      .toPromise()
      .then((result: any) => {
        if (!result.sucess) {
          errorSendPayment++;
        }
      })
      .catch((response: HttpErrorResponse) => {
        this.httpErrorResponseHandler(response);
      });
    });

    const promise: Promise<boolean> = new Promise((resolve, reject) => {
      if (errorSendPayment <= 0) {
        resolve();
      } else {
        reject();
      }
    });
    return promise;
}

1 个答案:

答案 0 :(得分:1)

  1. 使用Observable的zip运算符来组合http调用。

  2. 并检查结果是否有错误。

  3. 然后通过致电toPromise做出承诺。

  4. 更新如果您使用的版本高于RxJS 5.5,请导入一个运算符。


import { zip } from 'rxjs';

public sendPaymentValues(sale: any, session: string): Promise<boolean> {
  const headers = this.getHeader();
  const obs$ = sale.data.list.map(payment => this.http.post(`${api}payment/`, payment, headers))

  return zip(...obs$).map(arr => arr.some(res => !res.success)).toPromise()
}