Я знаю, что эта проблема изучалась тысячу раз, но я пробовал множество решений, но она все еще не работает.
Я хочу связать обещания от http get, но мне нужно дождаться предыдущегоперед запуском следующего, потому что метод get возвращает мне число, которое помещается в массив, и его нужно правильно упорядочить.
Что я пробовал: поместите каждое обещание в массив, а затем используйте уменьшениеметод, но это не сработало.Я думаю, что сложность заключается в том, что у меня есть состояние одного из параметров моего получения, значение которого изменяется.эти значения находятся в массиве, поэтому я попытался выполнить forEach с ожиданием, но это не сработало.
Итак, вот мой текущий код:
async getAEObservable(checkIn: Date, checkOut: Date, adults: number, HotelID) {
var In = checkIn;
var Out =checkOut;
var promises=[];
var id = []
HotelID.forEach(element =>
id.push(element))
var index=0
var ind = HotelID[0]
if (HotelID.length !== 0) {
if (ind !== "NULLNULL") {
console.log('ok')
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Ama-Pos': '{"agentSine": "A9998WS","agentUserID": "AA","agentDutyCode": "GS","agencyDetails":{"currencyCode": "EUR","identifiers": [{"type": "IATA","id": "QIJI12151"}],"address":{"cityCode": "NCE","countryCode": "FR"}}}'
})
};
let checkIn_param = this.transformDate(checkIn);
let checkOut_param = this.transformDate(checkOut);
let apiUrl = `${this.apiRoot_v0}?hotelIds=${ind.toString()}&checkInDate=${checkIn_param}&checkOutDate=${checkOut_param}&roomQuantity=1&adults=2&radius=5&radiusUnit=KM&rateCodes=RAC&paymentPolicy=NONE&includeClosed=true&bestRateOnly=true&view=FULL&sort=NONE`
let url = `${apiUrl}`;
console.log(url)
return await this.apiCall(url, httpOptions, checkIn, checkOut, adults, HotelID); // here we are calling a function which contain a api call inside this function we are resolving the promise
} else {
// here we are not creating a promise bcs here we have simple push operation
this.resAE.price.push(0)
this.getAEObservable(checkIn, checkOut, adults, HotelID.slice(1));
return this.resAE
}
}
else {return this.resAE}
}
async apiCall(url, httpOptions,checkIn, checkOut, adults, HotelID) {
await new Promise(async (resolve, reject) => {
await this.httpClient.get<any>(url, httpOptions).toPromise().then(result => {
console.log(result)
var price = result['data']['0']['offers']['0']['price']['total'];
console.log(price)
this.resAE.price.push(price);
console.log(this.resAE)
return this.resAE
}).then(async resp => { if (HotelID.length !=0){
this.getAEObservable(checkIn, checkOut, adults, HotelID.slice(1));}
else{
resolve();}
}).catch(this.handleError)
})
}
async apiCall(url, httpOptions,checkIn, checkOut, adults, HotelID) {
return await new Promise(async (resolve, reject) => {
this.httpClient.get<any>(url, httpOptions).toPromise().then(result => {
console.log(result)
var price = result['data']['0']['offers']['0']['price']['total'];
console.log(price)
this.resAE.price.push(price);
console.log(this.resAE)
return this.resAE;
}).then(resp => { if (HotelID.length ===0){
return this.resAE
} else {
this.getAEObservable(checkIn, checkOut, adults, HotelID.slice(1));
resolve()};
}).catch(this.handleError)
})
}
Идентификатор должен выполнитьпервый get, заполните мой массив, и когда он закончится, перейдите к следующему вызову get, вызвав саму функцию, но удалив первый элемент HotelID, который я использовал для предыдущего get.
массив заполнен, так что нет никаких проблем, но это не очень хорошо, я думаю ...
Я просто отредактировал свой вопрос, чтобы сказать, что console.log (url) показывает мне, что URL созданы вхороший заказ