2016-11-11 10 views
0

У меня есть служба, которая получает данные с сервера каждые 3 секунды. Иногда сервер работает очень медленно, и многие ответы появляются через 5 или 6 секунд. Когда это произойдет, моя служба начинает отменять каждый запрос, а не ждать ожидающего. Как я могу предотвратить это?Угловой 2, опрос http-запроса и ожидание медленных ответов

public getCallDiagnostic():Observable<IRespWidgets>{ 

     let body = JSON.stringify({manager:"CallDiagnosticServiceManager", 
            action:"GetCallDiagnostic", 
            WEB_USER_TOKEN:this._authenticationService.getUserToken()});  
     let options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})}); 

     return Observable.timer(0,3000) 
       .switchMap(()=>this._http.post(this._apiUrl,body,options))      
       .map(res => <IRespWidgets>res.json().data)   
       .catch(this.handleError);  
    } 

ответ

2

Ваши запросы аннулируются, так как вы используете switchMap. Если вы хотите получить ответ от каждого запроса, просто использовать mergeMap:

return Observable.timer(0,3000) 
      .mergeMap(()=>this._http.post(this._apiUrl,body,options))      
      .map(res => <IRespWidgets>res.json().data)   
      .catch(this.handleError);  

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

Редактировать: Если вы хотите выполнить следующий запрос, как только будут получены предыдущие, вы можете использовать concatMap. ConcatMap примет следующее значение и обработает его. Это не займет следующего значения (даже если оно поступит), если предыдущий не обрабатывается.

return Observable.timer(0,3000) 
      .concatMap(()=>this._http.post(this._apiUrl,body,options))      
      .map(res => <IRespWidgets>res.json().data)   
      .catch(this.handleError);  
+0

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

+0

@KwintenP могу я сделать это, как я сделал это здесь: http://plnkr.co/edit/6fBPFCus3HhZmCFBXFKq Ofcourse Я имею в виду требование, когда каждый запрос должен ждать завершения предыдущего –

+0

Я не думаю, что использование Повтор позволит вам только начать выполнение следующего запроса, когда предыдущий закончен. – KwintenP

 Смежные вопросы

  • Нет связанных вопросов^_^