【问题标题】:AngularJS $q service response in sequence with exception handlingAngularJS $q 服务响应按顺序进行异常处理
【发布时间】:2018-01-03 08:03:45
【问题描述】:

我有一个函数,它使用 for 循环的承诺按顺序给我响应异步调用,但是当我从代码中得到异常时循环中断,但即使在函数抛出异常后我也想继续我的循环。

我的异步函数是

function asyncFun(a) { 
    var q = $q.defer(); 
    setTimeout(function(){
        if(a == 4) throw new Error('custom error'); 
        q.resolve(a);
    }, 1000); 
    return q.promise; 
}

链函数是

function getData() {
    var chain = $q.when();
    for (var i = 0; i < 10; i++) {
        (function(i) {
            chain = chain.then(function() {
                return asyncFun(i).then(function(res) {
                    console.log(res);
                }).catch(function(ex) {
                    throw ex;
                });
            }).catch(function(ex) { throw ex });
        })(i);
    };
    return chain
}

当我调用getData(); 时,它会在i = 4 上引发错误后停止循环,但我想继续for 循环以获取所有 10 个条目。

任何帮助将不胜感激。

【问题讨论】:

  • 你将如何解决这个错误?当您继续执行循环时,您的承诺之一不会被拒绝。也许您应该将该错误视为特殊值并在解决正常值时解决它。
  • 我的asyncFun 在某些情况下预定义了抛出错误,这就是为什么我需要更改getData 来完成循环。
  • 为什么在不了解问题的情况下否决了这个问题
  • 我没有否决这个问题。也许是另一个人......

标签: javascript angularjs node.js promise q


【解决方案1】:

正如我在评论中所说,错误可能被视为特殊值,因此您可以在链承诺之后执行特殊行为。

试试这个代码:

function getData() {
    var chain = $q.when();
    for (var i = 0; i < 10; i++) {
        (function(i) {
            chain = chain.then(function() {
                return asyncFun(i).then(function(res) {
                    console.log(res)
                }).catch(function(ex) {
                    console.log(ex); // do not throw error but handle the error
                });
            }).catch(function(ex) { throw ex });
        })(i);
    };
    return chain
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多