【问题标题】:Error handling in Q promiseQ Promise 中的错误处理
【发布时间】:2016-06-08 16:36:51
【问题描述】:

我对 Q Promise 错误处理的理解有点困惑。假设我有以下功能(仅供演示):

function first() {
    console.log('first');
    var done = Q.defer();
    done.resolve('first');
    return done.promise;
}

function second() {
    console.log('second');
    var done = Q.defer();
    done.resolve('second');
    return done.promise;
}

function third() {
    console.log('third');
    var done = Q.defer();
    done.resolve('third');
    return done.promise;
}

function fourth() {
    console.log('fourth');
    var done = Q.defer();
    done.resolve('fourth');
    return done.promise;
}

function doWork() {
    return first().then(function() {
        return second();
    }).then(function() {
        return third()
    }).then(function() {
        return fourth();
    });
}

doWork().catch(function(err) {
    console.log(err);
});

一切顺利。

现在,如果在 second、thirdfourth 函数中出现一些错误(例如由异步调用引发),我可以优雅地捕获它。

例如,如果在第二、第三第四函数中,我添加:

throw new Error('async error');

错误被捕获。完美!

但让我感到困惑的是,如果在第一个函数中抛出错误,则错误不会被捕获并且会中断我的执行。

请有人告诉我为什么或我做错了什么?

非常感谢!

【问题讨论】:

    标签: javascript error-handling promise q


    【解决方案1】:

    只有then 回调中的异常会被 Promise 实现捕获。如果你在firstthrow,异常就会冒泡,只会被try-catch 语句捕获。

    这正是异步(承诺返回)函数should never throw 的原因。相反,拒绝您返回的承诺(done.reject(…)return Q.reject(…))。如果你不信任你的函数,你可以使用Promise.resolve().then(first).… 来启动你的链。

    【讨论】:

    • 您也可以使用q.fcall(first).then(second)...开始您的连锁店
    • @the4lt:是的,当然,我忘了这是一个特定于 Q 的问题。 resolve().then(…) 基本相同,但更便携。
    【解决方案2】:

    将可能中断的逻辑包装在 try 块和 reject 承诺中,并将错误放在 catch 块中。

    var def = q.defer();
    try {
      // sync or async logic that can break
    }
    catch (ex) {
      q.reject(ex);
    }
    return def;
    

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2019-02-17
      • 1970-01-01
      • 2019-01-05
      • 2016-04-20
      • 1970-01-01
      • 2014-07-03
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多