gpt4 book ai didi

javascript - 函数返回 Promise,检查错误

转载 作者:行者123 更新时间:2023-11-28 07:37:36 25 4
gpt4 key购买 nike

我有一个函数doSomething(),它利用 Q 框架返回一个 promise 链。内容类似于:

loadDataSet : function (params) {

return Q.fcall(function() {
//Do Something
})
.then(function(){
//Do Something Else
throw New Error('unexpected error');
});
}

调用代码类似于:

var promise = loadDataSet(args);

我想知道是否引发了该错误。请注意,在 loadDataSet 函数实现中,我没有使用 .done() 函数。

到目前为止,我的代码看起来像这样,但未能成功捕获错误并对其进行适当处理(此处,代码已稍作修改,与上面略有不同):

try {
loadDataSet(args)
.catch(function(error) {
return error
})
.done();
}....

目标是处理来自 try-catch block 的错误。我错过了什么?

最佳答案

好吧,这将是一件很糟糕的事情。

你不能

虽然许多 Promise 库允许您执行此操作,并且会为您报告未处理的拒绝 - 在 Q 中您没有方法自动检测这些失败。

您必须使用.done或更改 promise 库。哎呀,甚至本地人也 promise are going to be able to do this in a few days .

Q具体解决方案:

在 Q 中,您唯一现实的选择是使用 .done,与 then 不同,done 不是抛出安全的,您可以从那里抛出异常,并且它们不会被抑制- 这要求您记住始终使用 done 终止链,但它有效:

myObj.loadDataSet(handleSuccess, handleError).done(); // will throw on rejection

就我个人而言,在 Q 解决这个问题和其他问题之前,我不建议任何人使用它。

现代库和原生 promise

我写了一个specification基于 Domenic 和 Petka 的工作, promise 库能够全局报告错误并 Hook 它们。一些库已经实现了这一点,包括bluebird 和when。 Domenic 正在研究 Web 浏览器的并行规范。

当前支持或将在未来几周内支持的有:bluebird、when、es6-promise、rsvp 和 io 中的 native Promise。

// log any unhandled promise rejections
process.on('unhandledRejection', function(reason, p){
console.log("Possibly Unhandled Rejection at: Promise ", p, " reason: ", reason);
// application specific logging here
});

对于浏览器,类似于:

window.addEventListener("unhandledrejection", function(e) {
var reason = e.detail.reason;
var promise = e.detail.promise;
console.log("Unhandled rejection", promise, reason);
});

该协议(protocol)支持较少,但有计划将其包含在 native promise 中。目前,Firefox 原生 Promise 将报告未处理的拒绝,Chrome 也会尝试 - 但还没有针对它的浏览器 Hook (不过即将推出)。

请注意,团队正在开发非常有趣的工具。在与 Paul Irish 讨论之后,我相信在浏览器中调试 Promise 的工具方面将会有伟大的事情发生,这将使 native Promise 几乎像 Bluebird Promise 一样可调试(这太棒了!)。

关于javascript - 函数返回 Promise,检查错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28417359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com