【问题标题】:stop/exit for loop on first reject promise in angular JS在 Angular JS 中第一次拒绝承诺时停止/退出循环
【发布时间】:2016-12-10 10:12:48
【问题描述】:

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

我有一个返回承诺的方法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(如果有任何条目)与错误一起记录。这是我的工作代码。

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();
 });

【问题讨论】:

    标签: javascript angularjs for-loop angular-promise


    【解决方案1】:

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

    查看this blogpost。那个装饰器似乎正是这样做的。

    【讨论】:

    • 在您的 plunker 中,您明确设置为根据关键条件退出功能,但在我的情况下;它需要在拒绝优先时定义它
    • 那么您希望异步调用同步运行吗?当他们被拒绝时停止?
    • 是的,正是我想要的。让我更新一下我到目前为止所做的事情
    • 查看this blogpost。那个装饰器似乎正是这样做的。
    • 这很有趣,但是O怎么调用$q.seqAll()呢?在$q.seqAll(iterator);
    猜你喜欢
    • 2015-11-27
    • 2018-07-23
    • 2015-08-26
    • 2017-04-20
    • 2023-03-20
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多