2016-12-17 30 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异步执行所有承诺,您可以从数组中获得合适的承诺结果。