【发布时间】:2021-06-13 08:10:10
【问题描述】:
我有这段代码调用函数 getTableData 并期望得到一个 Promise 作为回报。
function populateTableRows(url) {
successCallback = () => { ... };
errorCallback = () => { ... };
getTableData(url, successCallback, errorCallback).then(tableData => {
// do stuff with tableData
}
}
这在我的代码库中的许多地方都使用过,我希望在不再使用 jQuery 的 ajax(以及一般的 jQuery)时保持相同的行为
在 getTableData 中,我目前正在使用$.ajax,就像这样
function getTableData(url, successCallback, errorCallback) {
successCallback = successCallback || function() {};
errorCallback = errorCallback || function() {};
const ajaxOptions = {
type: 'POST',
url: url,
dataType: 'json',
xhrFields: {
withCredentials: true
},
crossDomain: true,
data: { // some data }
};
return $.ajax(ajaxOptions).done(successCallback).fail(errorCallback);
}
这当前会为成功的请求返回一个 Promise。对于调用 fail 的错误请求,似乎没有返回 Promise 并且 then 没有在调用函数中运行(在这种情况下没问题)。
将请求转换为使用 fetch 时,我有这样的事情
function getTableData(url, successCallback, errorCallback) {
successCallback = successCallback || function() {};
errorCallback = errorCallback || function() {};
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
credentials: 'include',
body: { // some data }
})
.then(response => {
let json = response.json();
if (response.status >= 200 && response.status < 300) {
successCallback(json);
return json;
} else {
return json.then(error => {throw error;});
}
}).catch((error) => {
errorCallback(error);
return
});
成功的请求似乎与我目前拥有的 ajax 代码的行为相似,但现在 then 回调正在针对导致我的代码出错的错误请求运行。
fetch 有没有办法模仿 jQuery 的 fail 行为,其中 Promise 似乎因错误请求而中止?我对使用 Promises 还很陌生,经过一些实验/搜索后,我无法提出解决方案。
【问题讨论】:
-
是的,fetch MDN 专门解决 jquery.ajax 的差异: fetch 规范与 jQuery.ajax() 在以下重要方面不同: 从 fetch() 返回的 Promise 不会拒绝 HTTP 错误状态即使响应是 HTTP 404 或 500。相反,只要服务器响应标头,Promise 就会正常解析(如果响应不在 200–299 范围内,则响应的 ok 属性设置为 false ),并且它只会在网络故障或任何阻止请求完成的情况下拒绝。
标签: javascript jquery ajax fetch