2016-01-13 12 views
1

我使用幾個外部數據庫sto獲取我需要在我的數據庫中創建記錄的數據。我有一個應用程序,用戶可以在其中搜索電影並將其添加到監視列表中。如何在Angular中鏈接多個http調用

爲此,我需要準備以下數據,

  1. 影音數據,如標題,發佈日期和編號。
  2. imdb評級。
  3. 電影配樂,如演員和導演。

這是我現在該怎麼辦呢,

movieAdd.add(movie.id).then(function(response){ 
    $scope.movieListID = response; 

    movieAdd.imdbRating($scope.movieListID.imdb_id).then(function(response){ 
    $scope.movieImdbRating = response; 

    movieAdd.crew(movie.id).then(function(response){ 
     $scope.movieCredits = response 

     return createMovie.create({ 
     id:    $scope.movieListID.id, 
     imdb_rating: $scope.movieImdbRating.imdbRating, 
     title:   $scope.movieListID.original_title, 
     image:   $scope.movieListID.poster_path, 
     movie_id:  $scope.movieListID.id, 
     backdrop:  $scope.movieListID.backdrop_path, 
     overview:  $scope.movieCredits.overview 
     }) 

    }) 
    }) 
}) 

我調用服務,返回商店的範圍的響應,所以我可以在以後使用它,等等。

這是做這件事的正確方法,還是有更好的方法?

+0

從技術上講,方法沒有任何問題,但我建議你將承諾鏈展平 - http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/更新:Martijn Welkers的回答就是一個很好的例子。 – tiblu

回答

2

When chaining promises you can just return a promise instead of nesting them像這樣:

movieAdd.add(movie.id).then(function(response){ 
    $scope.movieListID = response; 
    return movieAdd.imdbRating($scope.movieListID.imdb_id); 
}).then(function(response){ 
    $scope.movieImdbRating = response; 
    return movieAdd.crew(movie.id) 
}).then(function(response){ 
    $scope.movieCredits = response 

    return createMovie.create({ 
    id:    $scope.movieListID.id, 
    imdb_rating: $scope.movieImdbRating.imdbRating, 
    title:   $scope.movieListID.original_title, 
    image:   $scope.movieListID.poster_path, 
    movie_id:  $scope.movieListID.id, 
    backdrop:  $scope.movieListID.backdrop_path, 
    overview:  $scope.movieCredits.overview 
    }); 
}) 

這有助於保持你的代碼扁平化和清潔

+0

謝謝你的鏈接,給出一些很好的見解。 –

0

這取決於你想如何使用這些信息。如果你只打算在scope之內使用它,那麼使用它會簡單地做到這一點。

通常從習慣我會存儲請求信息使用LocalStorage作爲JSON並從那裏訪問它。

這取決於但該方案..

0

嘗試使用

$ q.all

的諾言鏈

看看下面的例子:

> http://jsfiddle.net/ThomasBurleson/QqKuk/ 
+0

如果你使用的是角度的$超時你不必將它包裝在$ apply –

+0

@MartijnWelker中,它說'//所以使用$ timeOut()或$ apply()' –

+0

@PeterBoomsma如果你使用$ apply你自己可以運行'$ digest已經在進行'錯誤,所以最好使用$ timeout –

相關問題