2016-12-17 29 views
0

我一直在尋找並尋找無處不在的例子,以瞭解如何使它正常工作。我試過使用$ q.all(),它不起作用。我似乎無法承諾正常工作,或者我沒有正確訪問它們。我正在進行一次API調用來檢索有關電影的信息,並且我想讓它們按發佈日期排序。最簡單的方法是按照我製作的順序保持通話。我按發佈日期排列電影ID,並按照該陣列順序調用它們。然後我想將數據從調用中推送到新的數組。但它並不總是按照正確的順序進行。有人可能會告訴我我可能做錯了什麼嗎?

$scope.movies = [ 
     {url:"tt3470600", group:"m",youtube:"Vso5o11LuGU", showtimes: "times1"}, 
     {url:"tt3521164", group:"m",youtube:"iAmI1ExVqt4", showtimes: "times2"} 
    ]; 

$scope.imdb = function() { 
    var promises = []; 
    for(var i = 0; i < $scope.movies.length; i++) { 
     var movie = $scope.movies[i]; 
     var options = {trailer: movie.youtube, times: $scope.times[movie.showtimes]}; 
     var promise = $http.get('http://www.omdbapi.com/?i=' + movie.url); 
     promise.times = options; 
     promises.push(promise); 
    }; 
    return $q.all(promises); 
    }; 
    var x = $scope.imdb(); 
    console.log(x); 

所返回什麼是對象d$$state的關鍵。我很想保持訂單絕望,因爲我回來的時間有一個日期選擇,我想繼續下令。

+0

你正在進行異步調用來獲取數據。每次通話完成後可以不同。一旦所有承諾完成,您想要做的就是對結果進行排序。 –

回答

0

我覺得你只是錯過了一些重要的事情在這裏是

var deferred = q.defer(); //init promise 

deferred.resolve(item); // resolve the promise 

除此之外

不要忘記處理錯誤情況 - >使用延期.reject(item)for

一旦你用你的諾言完成後,保存所有的結果放入數組

var arr = []; 
q.allSettled(promises).then(function(results) { 
    arr = results; 
}); 
0

您可以使用$ Q在FUNC返回一個承諾,讓該函數內部HTTP調用,然後調用這個根據您希望得到承諾數組的順序。

var ajaxcallURl = { 
    0: 'https://api.github.com/users?since=84', 
    1: 'https://api.github.com/search/users?q=tyler', 
    2: 'https://api.github.com/users?since=357', 
    3: 'https://api.github.com/users?since=19990', 
    4: 'https://api.github.com/search/users?q=john', 
    5: 'https://api.github.com/users?since=2345', 
    6: 'https://api.github.com/users?since=1899', 
    7: 'https://api.github.com/search/users?q=james', 
    8: 'https://api.github.com/users?since=786', 
    9: 'https://api.github.com/search/users?q=nicholas', 
    10: 'https://api.github.com/users?since=99' 


} 

    var SomeAsyncCall = function() { 
    var status_deferred = $q.defer(); 
    var requestUrl = ajaxcallURl[count]; 
    $http.get(requestUrl). 
     success(function (data, status, headers, config) { 
      status_deferred.resolve(data); 
     }).error(function (errdata, status, header, config) { 
      //requestData call failed, pass additional data with the reject call if needed 
      status_deferred.reject(errdata); 
     }); 

    return status_deferred.promise; 
} 

有了這個承諾陣列可以使用$ q.all解決所有這些和得到的結果,當所有這些承諾完成。

function createPromisesArray() { 
    var promiseArray = []; 
    for (var i=0;i<10;i++){ 
     promiseArray.push(SomeAsyncCall()); 
    } 

    return promiseArray; 
} 


var lstPromised = createPromisesArray(); 

$q.all(lstPromised).then((values) => { 
    console.log(values[0]); 
    console.log(values[1]); 
    // .... 
    console.log(values[9]); 

    values.forEach(function (result) { 
     console.log(result) 
    }); 

即使$ q.all異步執行所有承諾,您可以從數組中獲得合適的承諾結果。