Цепочка обещаний в последовательном порядке - PullRequest
1 голос
/ 28 мая 2019

Я знаю, что эта проблема изучалась тысячу раз, но я пробовал множество решений, но она все еще не работает.

Я хочу связать обещания от 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 созданы вхороший заказ

1 Ответ

0 голосов
/ 28 мая 2019

вы можете попробовать вот так.

async getAEObservable(checkIn: Date, checkOut: Date, adults: number, HotelID) {
 console.log(HotelID);
    var In = checkIn;
    var Out =checkOut;

    var  promises=[];

    var id = []
    HotelID.forEach(element =>
    id.push(element))
    console.log(id)
    var index=0
    var ind = HotelID[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 apiCall(url, httpOptions); // 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
      }

вот функция вызова API

apiCall(url, httpOptions) {
 return new Promise((resolve, reject) => {
this.httpClient.get<any>(url, httpOptions).toPromise().then(res => {
            console.log(res)
            var price = res.data[0].offers[0].price.total;
            console.log(price)
            this.resAE.price.push( price);
            console.log(this.resAE)
            console.log(id)
            console.log(id.slice(1))
            return this.resAE;
          }).then( resp => {
             this.getAEObservable(checkIn, checkOut, adults, HotelID.slice(1))
             resolve();
         }).catch(this.handleError)
})
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...