我一直在寻找和寻找一个如何使其正常工作的例子。我尝试过使用$ 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
除此之外
不要忘记处理错误案例 - &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结果。