2017-01-05 1 views
0

Вот часть кода одного из моих контроллеров.

//service call to add record to database 
//bookApi has addBook method which contains a $http.post inside 

bookApi.addBook(book); 

//service call to show list of all books 
//bookApi has a getBooks method which contains $http.get call 

bookApi.getBooks().then(function(response){ 
      $scope.booklist = response.data; 
    },function(data,status,config,headers) { 
     alert('some error occured'); 
    }); 

Что происходит, когда Booklist отображается на странице иногда getBooks называют заканчивается первым перед addBook, так как они оба асинхронным. SO на странице, когда книга представлена ​​на странице «Добавить книгу», следующая страница, которая отображается на дисплее, представляет собой список страниц книг, который иногда не содержит недавно добавленную книгу (вам нужно будет обновить).

Как этого можно избежать?

+0

Вам нужно будет связать вызов get с сообщением, иначе он будет обрабатывать их как async в любом порядке. Вы должны убедиться, что сообщение закончилось, прежде чем делать get –

+0

'getBooks' должен быть вызван после завершения' bookApi.addBook (book) 'call using chaining. –

ответ

3

цепь обещание вместе в плоской форме, как так:

bookApi.addBook(book).then(function() { 
    return booksApi.getBooks(); 
}).then(function(response) { 
    $scope.booklist = response.data; 
}, function(data,status,config,headers) { 
    alert('some error occured'); 
}); 

Для борьбы с обратным вызовом ад, вернуть getBooks в функции обратного вызова. Как правило, хорошая методология обещания говорит, что вы не должны связывать then внутри другого then, но верните обещание и продолжите цепочку.

+0

Обработчик отклонения в методе' .then' получает объект errorResponse , а не разброс четырех аргументов (данные, статус, ... – georgeawg

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