Promise和泛型.catch()语句

时间:2015-07-11 07:33:03

标签: javascript promise q bluebird

我正在为我的系统编写一个API,它正在向服务器发送一个XHR并返回一个应该由调用者处理的promise - 到目前为止一直很好。

对于每个API调用,我必须使用.then.catch调用,但通常(如75%的时间).catch引用相同的功能,只使用{{ 1}}。

我的问题是 - 有没有办法为我创建的每个承诺附加一个默认的catch语句?(让我们说打印到控制台),以及我希望的每个承诺进一步处理拒绝,我会添加另一个console.error调用(甚至覆盖它)?

简化示例,其中每个调用都有自己的.catch:http://jsbin.com/waqufapide/edit?js,console

尝试实现所需行为的非工作版本:http://jsbin.com/nogidugiso/2/edit?js,console

在第二个示例中,我返回一个附加.catch处理程序的承诺,而不是仅仅返回deferred.promise

catch()

在这种情况下,都会调用return deferred.promise.catch(function (error) { console.error(error); }); catch和then函数。

我确实知道Q暴露了then函数和getUnhandledReasons()事件,但我真的不想对每个promise使用onerror,也不想构建某种定时器/间隔处理未处理拒绝的清单。

其他库,例如bluebird暴露.done()事件,我必须承认这是一个更好的解决方案,但仍然不是我正在寻找的。

3 个答案:

答案 0 :(得分:1)

我认为你要做的就是在你记录它之后重新抛出异常,以便其他处理程序能够正确处理它:

return deferred.promise.catch(function (error) {
  console.error(error);
  throw e; // rethrow the promise
});

答案 1 :(得分:1)

使用NodeJS进程来引发unhandledRejection。如果您不使用NodeJS,则可以使用此解决方法:

// Simulating NodeJS process.emit to handle Q exceptions globally
process = {
    emit: function (event, reason, promise) {
        switch(event)
        {
            case 'unhandledRejection':
                console.error("EXCEPTION-Q> %s", reason.stack || reason)
                break;
        }
    }
}

答案 2 :(得分:0)

使用蓝鸟Promises,您可以致电

Promise.onPossiblyUnhandledRejection(function(error){
    // Handle error here
    console.error(error);
});

使用iojs,您可以使用指定的<{1}}处理程序 here 。 (另外值得一读 this this

据我所知,其他地方的本地Promise和Q Promises都不提供此功能。