2017-01-05 4 views
0

私のコントローラの1つのコードの一部です。

//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'); 
    }); 

ブックリストがページに表示されたとき、彼らは両方とも非同期であるため、何が起こるかというと、時々はgetBooksは最初addBook前に終了を呼び出しています。ページのSOをクリックすると、書籍が[ブックを追加]ページで送信されると、次に表示されるページには、新しく追加された書籍が最初に表示されない書籍ページのリストが表示されます(更新する必要があります)。

これをどのように回避できますか?コールバック地獄に対抗するために

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を返す。そうのような平坦な方法で一緒に約束は

+0

getコールをポストに連鎖させる必要があります。そうしないと、両方とも非同期で非同期として扱われます。 –

+0

'getBooks'は連鎖を使って' bookApi.addBook(book) '呼び出しの完了後に呼び出されるべきです。 –

答えて

3

チェーン。通常、良い約束方法ではthenを別のthenの中にチェーンしないでくださいが、約束を返して代わりにチェーンを続けるといいでしょう。

+0

' .then'メソッドの拒否ハンドラはerrorResponseオブジェクトを受け取ります4つの議論の広がりではない(データ、状態、... – georgeawg

関連する問題