【发布时间】:2016-03-02 06:32:57
【问题描述】:
我有一些 Javascript 代码用一些同步的后处理来做一些异步的东西,然后再做一些异步的东西(XHR -> 解析 XHR -> 基于第一个的新 XHR)。我没有完成错误处理:
/* API */
function getFile(name) {
return $.ajax({
url: name + ".json"
}).then(function(data) {
return data.id
}, handleError)
}
function handleError(errorObj) {
if (errorObj.status) {
return errorObj.status
} else {
return errorObj
}
}
function myApiCall() {
return getFile(1)
.then(getFile, handleError)
.then(getFile, handleError)
.then(getFile, handleError)
.then(getFile, handleError);
}
/* caller */
function failFunction(status) {
console.log("fail: ")
console.log(status)
}
myApiCall().then(function(id) {
console.log(id)
}, failFunction)
1.json 看起来像这样
{
"id": "2"
}
只引用下一个文件,其他的都是等价的。
直到这里一切都很好(即使我不确定这是否是进行错误处理的最佳方法)。如果所有文件都存在,则调用调用者的成功函数,否则调用错误函数。
但是当我的同步代码出现一些错误时,一切都会中断
function getFile(name) {
return $.ajax({
url: name + ".json"
}).then(function(data) {
throw new Error(42) // <---------
}, handleError)
}
现在我得到一个控制台输出
Error: 42
没有进一步处理,调用者不会被通知。
我尝试过类似的方法
function getFile(name) {
return $.ajax({
url: name + ".json"
}).then(function(data) {
throw new Error(42)
}, handleError)
.catch(handleError)
}
但这并没有使任何事情变得更好。最重要的是我得到一个TypeError: $.ajax(...).then(...).catch is not a function
在这种情况下如何正确解决错误处理?
【问题讨论】:
-
如果您从 catch 或错误处理程序返回值,则错误不会传播 - 如果您希望它传播,请抛出错误或返回 Promise.reject。 jquery 函数可能会弄乱 Promise 链这一事实并不奇怪,jquery Promise 不是(至少在 v3 之前)真正符合 Promise/A+
标签: javascript jquery ajax promise