$ http AngularJS调用按顺序存储在数组中

时间:2016-12-17 03:49:44

标签: angularjs http angular-promise

我一直在寻找和寻找一个如何使其正常工作的例子。我尝试过使用$ 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。我很乐意拼命保留订单,因为我回来的时间有一个日期选择,我想继续订购。

2 个答案:

答案 0 :(得分:0)

我认为你错过了重要的事情

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

以及

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

除此之外

  不要忘记处理错误案例 - &gt;对那些

使用deferred.reject(item)

完成所有承诺后,将所有结果保存到数组中

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

答案 1 :(得分:0)

你可以在func中使用$ q来返回一个promise并在该函数中进行http调用,然后根据你想要获得promises数组的顺序调用它。

  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;
}

使用此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异步执行所有promise,也可以从数组中获得相应的promise结果。