javascript - promise 错误/异常处理设计

标签 javascript jquery exception asynchronous promise

我想创建一个执行异步操作并返回 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/

相关文章:

javascript - 调用方法一次,但在主干中执行了多次

jquery - 以速度循环/重新启动动画,无需反向播放

.net - 返回 ""代替正确的字符串

c# - Dictionary<TKey, TSource> 的神秘行为

c++ - 如果在成员中抛出异常,则删除母对象

javascript - 使用附加到同一 ID 的 HTML 按钮发送不同的值

javascript - Promise.all(...).spread 不是并行运行 Promise 时的函数

javascript - 如何匹配但排除以下 JavaScript 正则表达式中的等号?

javascript - 动态加载CSS的CSS窗口高度问题

jquery - 使其不可编辑后删除 <li> 元素的轮廓