Как обрабатывать ответ от медленного сервера

#angular #ionic-framework #ionic3 #angular5 #angular7

#angular #ionic-framework #ionic3 #angular5 #angular7

Вопрос:

Мне нужно получить некоторые данные с сервера.Ответ от сервера приходит очень медленно. Я хочу сохранить ответ в массиве, чтобы его можно было отобразить в шаблоне. Цель состоит в том, чтобы отложить сохранение ответа в массив до тех пор, пока сервер не вернет ответ

Я уже пробовал setTimeout (), но это не удается

Ts-файл

 ticketdetails()
{
  this.funName = 'online_service';
  var url = { url:'bookingdetails?username=....amp;password=....amp;bookingCode='   this.id};
  console.log(url);
  this.myservice.online_service(this.funName,url).subscribe(response => {

 if (response.code === '1') 
   {
     this.bookDetails = response;
     console.log('Book details inside function', this.bookDetails);
   }
  })
  console.log('Book details outside function' , this.bookDetails)
}
  

В консоли ,
Подробная информация о книге внутри функции отображает результат ответа от сервера
но,
Информация о книге вне функции отображается как null .

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

1. вы можете использовать boolean для его обработки

Ответ №1:

Я думаю, вы должны выполнять все операции / назначения в обратном вызове вызова функции. Поскольку вызов будет асинхронным, то до тех пор, пока вы не получите ответ от сервера, ваш дальнейший код выполняться не будет.

Код после вызова API будет выполнен, поэтому я думаю, что вызов API должен быть спроектирован таким образом, чтобы его ответ был завернут в обратный вызов, а затем он будет использован. Код, который вы пишете после вызова API, будет немедленно выполнен после этой строки, он не будет ждать поступления ответа, поскольку это очевидная природа Java script.

Пример: Служба Rest

 customHttpDefaultOptions= {
     headers: new HttpHeaders({
             'Content-Type': 'application/json'
     })
};

postRestCall(requestBody, data) {
    this.httpClient.post(apiURL, requestBody, this.customHttpDefaultOptions).pipe(retry(1))
            .subscribe(response => {
            data(response);
    }, error => data(this.handleError(error)));
}
  

Итак, здесь вы также должны что-то сделать, и как только ответ поступит, он будет заключен в обратный вызов, и вы сможете использовать его позже из обратного вызова.

Пример:

 this.restService.postRestCall(requestBody, data => {
    this.his.bookDetails = data;
});
  

Итак, если вы создали что-то вроде службы rest, вы также можете повторно использовать механизм вызова API, а не писать код вызова API на табличной основе.

Проблема вовсе не в медлительности.

Ответ №2:

  - isResponce: boolean =false;

       ticketdetails()
       {
         this.funName = 'online_service';
         var url = { url:'bookingdetails?username=....amp;password=....amp;bookingCode='  
   this.id};
         console.log(url);
         this.myservice.online_service(this.funName,url).subscribe(response =>
   {

        if (response.code === '1') 
          {
            this.isResponce = true;
            this.bookDetails = response`enter code here`;
            console.log('Book details inside function', this.bookDetails);
          }
         })