我想创建一个执行异步操作并返回 promise 的函数。 Action 是:
- 通过 AJAX 下载外部内容
- 如果内容无法下载(例如 URL 无效)-> 拒绝
- 如果内容下载成功,但我无法解析它 -> 拒绝
- 否则(内容已成功下载和解析)-> 解决
我现在得到的代码非常简单:
function fetch(hash){
return $.ajax({
method: "GET",
url: baseURL + "/gists/" + hash
}).then(function(response) {
return JSON.parse(response.files['schema.json'].content);
});
}
它只是一个从 github gist 获取数据的 jQuery AJAX 调用。目前:
- 当 AJAX 无法解析时 -> promise 被拒绝 - OK
- 当 AJAX 被解析并且内容被正确解析时 -> promise 被解析 - OK
- 但是,如果 AJAX 已解析,但内容无效,则
JSON.parse
行会抛出错误并且 promise 不会被拒绝 它应该 - 失败
问题是 - 这样做的正确设计是什么?我可以用 Deferred 包装整个事情并手动处理它,但我认为可能有更简单的解决方案。我应该试一试吗?还是别的?
最佳答案
I could wrap entire thing with a Deferred and handle it manually
这听起来像 deferred antipattern .不要包装任何已经使用 promises 的东西。
I think there might be an easier solution. Should I do a try-catch?
是的:
.then(function(response) {
try {
return JSON.parse(response.files['schema.json'].content);
} catch (e) {
return $.Deferred().reject(e);
}
})
另见 Throwing an Error in jQuery's Deferred object .
Or something else?
实际上,您的原始代码在任何合理的 promise 实现中都可以正常工作,其中异常会隐式地变成拒绝。就是jQuery's fail .您可能只想 dodge jQuery's then
implementation .
关于javascript - promise 错误/异常处理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38684359/