Q承诺中的错误处理 [英] Error handling in Q promise
问题描述
function first(){
console.log '第一');
var done = Q.defer();
done.resolve('first');
return done.promise;
}
函数second(){
console.log('second');
var done = Q.defer();
done.resolve('second');
return done.promise;
}
函数third(){
console.log('third');
var done = Q.defer();
done.resolve('third');
return done.promise;
}
function fourth(){
console.log('4th');
var done = Q.defer();
done.resolve('4th');
return done.promise;
}
函数doWork(){
return first()然后(function(){
return second();
}) (function(){
return third()
})然后(function(){
return fourth();
});
}
doWork()。catch(function(err){
console.log(err);
});
一切顺利。
现在如果在第二,第三个或第四个函数中,我有一些错误(例如通过异步调用抛出),我可以优雅地抓住它。
例如,如果在第二,第三个或第四个函数中,我添加:
throw new Error('async error');
错误被捕获。完美!
但是让我困惑的是,如果错误被抛在第一个函数中,错误就不会被捕获,这会导致我的执行。
请别人告诉我为什么我做错了什么?
非常感谢!
只有然后
回调中的异常被promise实现所捕获。如果您在首先
中 throw
,则异常将会起泡,只会被try-catch语句捕获。 p>
这就是为什么异步(承诺返回)的功能应该永远不会 throw 。相反,拒绝你回来的承诺( done.reject(...)
或 return Q.reject(...)
)。如果您不信任您的功能,您可以使用 Promise.resolve()。然后(第一)。...
启动您的链条。
I'm a bit confused understanding Q promise error handling. Let's say I have the following functions (for demonstration only):
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);
});
Everything went fine.
Now that if in second, third or fourth function, I've got some errors (thrown by an async call for example), I could catch it gracefully.
For example, if in second, third or fourth function, I add:
throw new Error('async error');
The error is caught. Perfect!
But what makes me confused is that if the error is thrown in first function, the error is not caught and that breaks my execution.
Please someone tell me why or what I am doing wrong?
Thanks a lot!
Only exceptions in then
callbacks are caught by promise implementations. If you throw
in first
, the exception will bubble and would only be caught by a try-catch statement.
That's exactly why asynchronous (promise-returning) functions should never throw. Instead, reject the promise you're returning (done.reject(…)
or return Q.reject(…)
). If you don't trust your function, you can use Promise.resolve().then(first).…
to start your chain.
这篇关于Q承诺中的错误处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!