【问题标题】:Promises inside foreach in angular 4/typescriptangular 4/typescript 中的 foreach 中的 Promise
【发布时间】:2019-04-23 00:37:30
【问题描述】:

在 foreach 中调用 Promise 的最佳方式是什么?

我有一个数组,需要将每个项目发送到 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;
}

【问题讨论】:

    标签: angular typescript angular4-httpclient


    【解决方案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()
    }
    

    【讨论】:

    • 返回导入错误:“可观察” 类型上不存在属性“地图”。我使用'return zip(...obs$).map(arr => arr.some(res => !res.success)).toPromise();'和'从'rxjs'导入{ zip};'
    猜你喜欢
    • 2017-11-14
    • 2018-11-22
    • 1970-01-01
    • 2019-04-18
    • 2017-12-22
    • 1970-01-01
    • 2014-10-04
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多