【发布时间】:2016-12-05 16:17:19
【问题描述】:
我想创建一个执行异步操作并返回承诺的函数。动作是:
- 通过 AJAX 下载外部内容
- 如果无法下载内容(例如无效的 URL)-> 拒绝
- 如果内容下载成功,但无法解析-> reject
- 否则(内容下载并解析成功)-> 解决
我现在得到的代码非常简单:
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 无法解析时 -> 承诺被拒绝 - 好的
- 当 AJAX 被解析并且内容被正确解析时 -> 承诺得到解决 - 好的
-
然而,如果 AJAX 已解决,但内容无效,
JSON.parse行会抛出错误,并且承诺 不会被拒绝,它应该 - FAIL
问题是 - 这样做的正确设计是什么?我可以用 Deferred 包裹整个事情并手动处理它,但我认为可能有一个更简单的解决方案。我应该尝试捕捉吗?还是别的什么?
【问题讨论】:
-
这个问题是因为 jQuery 1.x 或 2.x Promise 不符合 Promise 规范并且不是 throw-safe。对于遵循规范的真正承诺,
.then()处理程序中的抛出将自动拒绝该承诺。您可以将 jQuery 承诺转换为真正的承诺并获得所需的行为,或者您必须自己捕获异常并返回被拒绝的承诺。 -
仅供参考,我建议不要使用
fetch()作为函数名称,因为较新的浏览器已经有一个名为fetch()的接口,描述为 here。
标签: javascript jquery exception asynchronous promise