我希望加载~10000个资源,并且在解析阶段一次性执行此操作会因为某些计算完成而花费太长时间.因此,我开始按顺序逐页加载资源,但由于所有这些资源都需要(在地图上)可见,因此基于用户输入的标准分页并不真正起作用.
我知道承诺可以链接如下:
promise.then(doThis).then(doThat).then(doWhat);
而且我知道可以使用$q.all解决一系列承诺:
$q.all([doThis, doThat, doWhat]);
然而我想要的是在我拒绝之前一次又一次地召唤相同的承诺.
例:
function next() {
var deferred = $q.defer();
if(someCondition) {
deferred.reject();
} else {
//do something
//store data somewhere
deferred.resolve();
}
return deferred.promise;
}
假设此函数执行一些$http调用并将结果存储在服务/控制器中的某处.如果它遇到某种情况(可能没有任何页面或http错误),它会拒绝一个承诺,否则它会解决它.
现在我想做一些像这样的伪代码
$q.loop(next).untilError(handleError);
在解决上一次下一次呼叫时,将在循环中调用next,直到拒绝.
这样的事情可能吗?
最佳答案 检查此演示的控制台:
JSFiddle.
它确保API的调用顺序使用1到5的userId.并在某些条件下停止(userId> 5).
angular.module('Joy', [])
.controller('JoyCtrl', ['$scope', '$http', function ($scope, $http) {
getUser(1, getUser);
function getUser(userId, next) {
if (userId > 5) {
console.log('Enough. Stop');
return;
}
$http.get('http://jsonplaceholder.typicode.com/posts?userId=' + userId).then(function (data) {
console.log(data.data);
next(userId + 1, next);
});
}
}]);