#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:
-
Используйте
zip
оператор Observable для объединения http-вызова. -
И проверьте, есть ли в результатах ошибка.
-
Затем сделайте обещание, вызвав
toPromise
. -
Обновление Если вы используете более высокую версию, чем 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’;’