Обещания внутри foreach в angular 4/typescript

#angular #typescript #angular4-httpclient

#angular #typescript #angular4-httpclient

Вопрос:

Каков наилучший способ вызвать обещание внутри foreach?

У меня есть массив, и мне нужно отправить каждый элемент в RESTfull API. Но в то же время я должен проверить, соответствует ли ответ истине (у меня есть счетчик ‘errorSendPayment’). После всех запросов мне интересно отправить логическое значение или обещание, если у меня есть одна (или более) ошибка.

Как я могу улучшить свой код?

 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:

  1. Используйте zip оператор Observable для объединения 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()
}
  

Комментарии:

1. Возвращает ошибку импорта: свойство ‘map’ не существует для типа ‘Observable<{}[]>. Я использовал ‘return zip(… obs $).map(arr => arr.some(res => !res.success)). toPromise();’ и ‘импортировать { zip } из ‘rxjs’;’