我对 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/