Javascript 使用Q.Promissions:如何捕获异步抛出?

Javascript 使用Q.Promissions:如何捕获异步抛出?,javascript,promise,q,Javascript,Promise,Q,我使用Q来表示承诺,但在设置一些测试时,我发现可以捕获在返回承诺的函数中抛出的异步错误 我试着将它包装在一个Q.when中,并链接一个fail和一个Q.fcall和一个链接的fail,但我无法让它工作 var func = function(){ var deferred = Q.defer(); setTimeout(function(){ throw new Error("asyn

我使用Q来表示承诺,但在设置一些测试时,我发现可以捕获在返回承诺的函数中抛出的异步错误

我试着将它包装在一个
Q.when
中,并链接一个
fail
和一个
Q.fcall
和一个链接的
fail
,但我无法让它工作

    var func = function(){

               var deferred = Q.defer(); 
               setTimeout(function(){
                    throw new Error("async error");
               },100);

               return deferred.promise;

            }

            Q.fcall(func)
            .then(function(){
                console.log("success"); 
            })
            .fail(function(err){
                console.log(err); 
            })

有办法做到这一点吗

setTimeout中的异常与承诺无关,您必须自己使用
try
-
catch
-块来捕获它

或者您使用:


我意识到这一点。问题是,通过Q执行的这些函数可能是在我的控制之外开发的,因此我不能依赖于正确的try/catch。我现在正在考虑选择在周围的承诺中添加一个计时器,至少能够在超时后进行拒绝,以便在我的框架中进行正确的异常处理。希望有一个更干净的方法。有
Q.timeout
。如果这些第三方函数没有任何错误,您就无能为力(或者尝试使用
window.onerror
)Geert Jan您只需要使用返回承诺(dot)的异步函数。这是一条简单且可接受的规则。试图破解本机函数只是为了让setTimeout返回承诺,这会给您带来更多麻烦。@Bergi我已经用您提出的解决方案创建了gist,但当我运行它时,它总是在控制台日志中打印“success”@PulakKantiBhattacharyya:当函数返回承诺时,您不需要使用
fcall
(并且在没有回调时,您不能使用它)。我已经更新了代码示例,以显示如何使用它。另请参见
function func(){
    return Q.delay(100).then(function(){
        throw new Error("async error");
    });
}

func()
.then(console.log.bind(console, "success"))
.fail(console.log.bind(console));