2017-02-15 2 views
1

Angular2, машинописныеangular2 2 async call

У меня есть компонент, который отображает по одному объекту за раз с сервера.

При нажатии кнопки форма выполняет некоторые действия над объектом, отправляет данные на сервер. Сразу же в следующей строке получается следующий объект.

this.rawS.updateTags({......}); //Update object 
this.candidateC.footerNavigateTo(.....);//Get next object 

Но есть условие гонки, где Аякса, чтобы получить следующий объект достигнет сервера до Аякса updateTags достигнет сервера.

Кодекс updateTags является

updateTags(rawCandidate) { 
    this.baseAjaxService.doPost(this.baseUrl + 'tags/update', rawCandidate) 
     .subscribe(data => { 
     console.log(data); 
     }); 
    } 

Код для doPost является

doPost(url, inputParamJSON){ 
    let httpResponse = this.http 
     .post(url, inputParamJSON, this.options) 
     .map(this.extractData) 
     .catch(this.handleAjaxError); 
    return httpResponse; 
} 

маршрут для 'continue_screening' имеет маршрут распознаватель, который приносит следующий объект.

Как я могу гарантировать, что footerNavigateTo() запускается только после того, как updateTags завершит полный цикл?

+0

Это не состояние гонки. То, что вы делаете, вызывает 'this.candidateC.footerNavigateTo()' перед вызовом 'this.rawS.updateTags()' callback. Другими словами, вы не дожидаетесь завершения вызова AJAX, прежде чем действовать на него. @ Ответ Vincismique правильный, вам нужно использовать 'flatMap' для того, чтобы связать вызовы. Этот ответ также может помочь: https://stackoverflow.com/questions/34104638/how-to-chain-http-calls-in-angular2/34107312 –

ответ

1

Если то, что вы хотите иметь различное поведение в зависимости от того, где функция updateTags(rawCandidate) называется, я предлагаю следующее решение:

updateTags(rawCandidate, action) { 
    this.baseAjaxService.doPost(this.baseUrl + 'tags/update', rawCandidate) 
     .subscribe(
     data => { 
     action(data); 

     }, 
     error => { 
      console.log("error"); //handle error here 
     }); 
    } 

Затем вы можете вызвать функцию так:

updateTags(rawCandidate, function(data){ 
    console.log(data); 
    this.candidateC.footerNavigateTo(.....);//here you can use data 
}); 
+0

Поток таков, что updateTags() используется в нескольких потоках. Невозможно вызвать функцию footerNavigateTo() в этой функции. – Sonal

+0

Затем вы хотите другое действие в зависимости от того, где вы называете updateTags? – ZanattMan

1

Что вы хотите достичь здесь, это связать ваши два http-звонка, сделать их иждивенцами каким-то образом. В Angular 1.X это будет сделано с использованием обещания, но с AngularJS 2 вы можете достичь этого, используя flatMap.

См. Ссылку http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http на Зависимые звонки раздел.

PS: Как указано в этом сообщении (Combining promises in Angular 2), вы также можете использовать toPromise(), чтобы преобразовать свой наблюдаемый (т. Е. Ваш асинхронный http-вызов) в Promise, если вы более знакомы с ним.