javascript - Q Promise 中的错误处理

标签 javascript error-handling promise q

我对 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);
});

一切都很顺利。

现在,如果在第二、第三第四函数中,我遇到了一些错误(例如由异步调用引发的错误),我可以优雅地捕获它。

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

throw new Error('async error');

错误已被捕获。完美!

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

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

非常感谢!

最佳答案

只有 then 回调中的异常才会被 Promise 实现捕获。如果您在 first抛出,异常将会冒泡,并且只能由 try-catch 语句捕获。

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

关于javascript - Q Promise 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35635177/

相关文章:

javascript - 如何使 div 跨浏览器一致地翻转?

javascript - 使用 capybara 捕获浏览器控制台日志

asp.net-mvc - MVC 中的错误处理

javascript - 返回 promise 链中引用的数据

Javascript:Promise 实现中出现错误

javascript - THEN 语句返回 promise /始终返回和一致返回错误

javascript - 通过图表上每个系列的缩放级别动态地将平均值添加到 Highcharts

javascript - 使用 morris 从 json 响应生成动态条形图

php - 如何为外部表单验证,CodeIgniter设置错误消息

javascript - 控制台向我显示 Angular 7 中的 ExpressionChangedAfterItHasBeenCheckedError