我对理解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');
错误被捕获。完美!
但令我困惑的是,如果在第一个函数中抛出错误,则不会捕获错误并且会导致我的执行中断。
请有人告诉我为什么或我做错了什么?
非常感谢!
答案 0 :(得分:4)
承诺实现仅捕获then
回调中的异常。如果您在throw
中first
,则异常将冒泡并且只会被try-catch语句捕获。
这正是异步(承诺返回)函数should never throw的原因。相反,拒绝您要返回的承诺(done.reject(…)
或return Q.reject(…)
)。如果您不相信自己的功能,可以使用Promise.resolve().then(first).…
启动您的链。
答案 1 :(得分:1)
在try
块中包含可能中断的逻辑,并reject
块中的错误包含catch
承诺。
var def = q.defer();
try {
// sync or async logic that can break
}
catch (ex) {
q.reject(ex);
}
return def;