在角度JS

时间:2016-12-10 10:12:48

标签: javascript angularjs for-loop angular-promise

我已经尝试了各种各样的方法,但仍然没有弄清楚如何解决这个问题。

我有一个返回承诺的方法iterator;此方法在循环中运行x次。我想如果iterator返回被拒绝的承诺,它应该停止执行并转到错误集合。

我尝试了从this SO asnwer获取的以下方法,但这会发送错误但执行到x次。

var foo = function(formdata) {
   var d = $q.defer();
   CallService.init()
  .then(function(response) {
    return CallService.fun1(formdata);
  })
  .then(function(response) {
     var row = {1:'one', 2:'two', 3: 'three' };
     var promiseArray = [];
     if (<key condition true>) {            
        var promise = Object.keys(row).map(function(i) {
            return iterator(i, row[i]).then(function(response){
                promiseArray.push(response);
                }, function(err){
                return $q.reject(err);
            });
        });
        return $q.all(promise); // reject if anyone is rejected, otherwise resolve
    }
    else {
        d.reject({
            message: "key condition failed."
        });
    }
    return d.promise;  
})
 .then(successHandler)
 .catch(errorHandler);
};

这是为每个循环调用的函数

var iterator = function(num, data) {
    var d = $q.defer();
    CallService.fun3()
    .then(function(response) {
        return CallService.fun4(data)
    })
    .then(function(response) {
       d.resolve(num);
    })
    .catch(function(err) {           
       d.reject(err);
    });
    return d.promise;
};

我希望如果iterator第一次发送拒绝而不是下一次发送拒绝并打破循环;

如何实现这一目标?

我也尝试过这种方式

var d = $q.defer();
for (var k in row) {
    if (isCalled) break;
    var promise = iterator(k, row[k]);
    promise.then(function(response) {
        promiseArray.push(response);
    }, function(err) {
        isCalled = true;
        d.reject(err);
    });
}
if (!isCalled && promiseArray.length > 0) {
    console.log('after for loop', promiseArray);
    d.resolve(promiseArray);
}

return d.promise;

但这也失败了......尽管有任何拒绝承诺,它总是为所有循环执行。

修改

我已尝试使用.reduce方法,但这在某种程度上有效但我需要发送promiseArray(如果有任何条目)alog with error。这是我的工作代码。

var first_promise = $q.resolve();
var start_promise = Object.keys(row).reduce(function(promise, key){
      return promise.then(function(result){
          if(angular.isDefined(result)) // as first_promise results undefined
              promiseArray.push(result);
          return iterator(key, row[key]);
      });
 }, first_promise);
 start_promise.then(function(res){
     return $q.when(promiseArray);
 }).catch(function(err){
     return $q.reject();
 });

1 个答案:

答案 0 :(得分:1)

澄清后更新了答案。 Op希望他的异步调用能够同步运行。当他们遭到拒绝时停止。

结帐this blogpost。装饰师似乎就是这么做的。