我有一些Javascript代碼做一些異步的東西一些同步後處理,然後再次異步的東西(XHR - >解析XHR - >新的基於第一個XHR)。我不明白的錯誤處理完成:錯誤處理在Javascript承諾
/* 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
在這種情況下錯誤處理如何解決正確?
如果您從捕獲或錯誤處理程序返回值,則錯誤不會傳播 - 如果您希望它傳播,則拋出錯誤或返回Promise.reject。 jquery函數可能會搞砸承諾鏈這一事實並不令人意外,jquery承諾不是(至少在v3之前)真正符合Promise/A +標準 –