是否可以创建一个承诺循环直到在 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);
        });
    }
}]);