是否可以创建一个承诺循环直到在 angular 中被拒绝
Is it possible to create a promise loop until reject in angular
我希望加载约 10000 个资源,并且由于某些计算正在进行,因此在解析阶段一次完成所有这些需要的时间有点太长。因此,我想到了按顺序逐页加载资源的想法,但是由于所有这些资源都需要可见(在地图上)标准,基于用户输入的分页实际上不起作用。
我知道 promise 可以这样链接:
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
调用并将结果存储在 service/controller 中的某处。如果它达到某个条件(可能不再有任何页面或 http 错误),它会拒绝承诺,否则会解决它。
现在我想做这样的伪代码
$q.loop(next).untilError(handleError);
其中 next
将在解决前一个 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);
});
}
}]);
我希望加载约 10000 个资源,并且由于某些计算正在进行,因此在解析阶段一次完成所有这些需要的时间有点太长。因此,我想到了按顺序逐页加载资源的想法,但是由于所有这些资源都需要可见(在地图上)标准,基于用户输入的分页实际上不起作用。
我知道 promise 可以这样链接:
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
调用并将结果存储在 service/controller 中的某处。如果它达到某个条件(可能不再有任何页面或 http 错误),它会拒绝承诺,否则会解决它。
现在我想做这样的伪代码
$q.loop(next).untilError(handleError);
其中 next
将在解决前一个 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);
});
}
}]);