Q承诺中的错误处理 [英] Error handling in Q promise

查看:133
本文介绍了Q承诺中的错误处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有点困惑理解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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆