如果HTTP状态代码在200和299范围内或等于304,则jQuery执行“success”功能。 但是,例如,对于代码401,我需要jQuery认为Ajax调用是成功的,并且它将响应评估为JSON并执行函数“success”。
问题是这种行为在“完成”方法中是硬编码的:
// Determine if successful
isSuccess = status> = 200 && status <300 || === status 304;
我真的不知道该怎么做。
编辑:
这就是我现在所拥有的:
var options = {
url: '',
type: 'POST',
data: {},
success: function(response, status){},
error: function(res, status, error){
notify("Une erreur s'est produite !", "danger");
},
complete: function(res, status){}
};
$.extend(options, opts);
var dataString = '';
$.each(options.data, function(key, value){
dataString += ((dataString.length > 0) ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)
});
$.ajax({
url: site_url + options.url,
type: options.type,
data: dataString,
dataType: 'json',
statusCode: {
401: function() {
setTimeout(function(){
location.reload();
}, 2000);
}
},
success: function(response, status){
if (response.response.result.status == 'ok'){
options.success(response, status);
} else {
if ('message' in response.response.result){
notify(response.response.result.message, "danger");
} else if (response.response.errors.length > 0) {
notify(response.response.errors[0], "danger");
}
}
},
error: options.error,
complete: options.complete
});
我希望根据提供的dataType解析答案(仅用于“success”方法),并且在代码401的情况下,处理与包含正确JSON的其他响应的处理相同代码,除了进一步的指令。
我认为jQuery无法更改指示请求失败的代码是错误的。无论如何,响应的内容可能很重要,需要特殊处理。 对于完整的网页,浏览器仍会显示服务器在发生错误时返回的内容。
答案 0 :(得分:3)
而不是试图超越&#34;成功&#34;回调为什么不只是在&#34;错误&#34;内部进行函数调用。在检查发生特定错误之前回调,当然。
error: function(a, b, c){
if(a.status == 401){
// Your custom function call / code.
}
}
答案 1 :(得分:1)
您是否必须处理success
或error
区块中的状态代码? complete
阻止怎么样?它遵循两种结果。
完整
类型:函数(jqXHR jqXHR,String textStatus)
请求完成时要调用的函数(执行成功和错误回调之后)。该函数传递两个参数:jqXHR(在jQuery 1.4.x,XMLHTTPRequest)对象和一个字符串,用于对请求的状态进行分类(“成功”,“未修改”,“nocontent”,“错误”,“超时”,“中止“,或”parsererror“)。从jQuery 1.5开始,完整的设置可以接受一系列函数。每个函数将依次调用。这是一个Ajax事件。
来源:http://api.jquery.com/jquery.ajax/
示例:
$.ajax({
url: "http://www.google.com"
}).success(function(){ //--> use .done() instead
//things to do on success
}).error(function(){ //--> use .fail() instead
//things to do on error
}).complete(function( data ) { //--> use .always() instead
switch(data.status){
//your logic here
}
});
答案 2 :(得分:0)
而不是成功使用complete
函数并检查xhr.statusText
值
$.ajax('url.json', {
complete:function(result) {
if(/^(2\d\d|304|401)$/.test(result.statusText)) {
success();
} else {
error();
}
}
});
答案 3 :(得分:0)
最后,鉴于需要通过“完整”方法,有必要重新编写jQuery的整个自动化。 所以在这种情况下使用$ .ajax没兴趣。
这就是我必须编写使用jQuery语法的替换函数的原因:
var altAjax = function(opts){
var options = {
url: '',
type: 'GET',
data: {},
dataType: 'text',
successCodes: [304, 401, 403, 404, 500],
statusCode: {},
success: [],
error: [],
complete: []
};
$.extend(options, opts);
var success = function(data, textStatus, xhr){
if ($.isArray(options.success)){
$.each(options.success, function(index, callback){
callback(data, textStatus, xhr);
});
} else if ($.isFunction(options.success)){
options.success(data, textStatus, xhr);
}
if ($.isFunction(options.statusCode[xhr.status])){
options.statusCode[xhr.status](data, textStatus, xhr);
}
}
var error = function(xhr, textStatus, errorThrown){
if ($.isArray(options.error)){
$.each(options.error, function(index, callback){
callback(xhr, textStatus, errorThrown);
});
} else if ($.isFunction(options.error)){
options.error(xhr, textStatus, errorThrown);
}
if ($.isFunction(options.statusCode[xhr.status])){
options.statusCode[xhr.status](xhr, textStatus, errorThrown);
}
}
var complete = function(xhr, textStatus){
if ($.isArray(options.complete)){
$.each(options.complete, function(index, callback){
callback(xhr, textStatus);
});
} else if ($.isFunction(options.complete)){
options.complete(xhr, textStatus);
}
}
var dataString = '';
$.each(options.data, function(key, value){
dataString += ((dataString.length > 0) ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(($.isArray(value) || $.isPlainObject(value)) ? JSON.stringify(value) : value);
});
var req = new XMLHttpRequest();
var url = options.url;
if (options.type.toUpperCase() != 'POST'){
url += ((url.indexOf('?') > -1) ? '&' : '?') + dataString;
}
req.onload = function(){
var textStatus = 'error';
if ((this.status >= 200 && this.status <= 299) || $.inArray(this.status, options.successCodes) > -1) {
var data;
switch (options.dataType.toLowerCase()) {
case 'json':
try {
data = JSON.parse(this.responseText);
} catch (ex){
error(this, textStatus, ex.name + ': ' + ex.message);
break;
}
textStatus = 'success';
success(data, textStatus, this);
break;
case 'xml':
try {
data = $.parseXML(this.responseText);
} catch (ex){
error(this, textStatus, ex.name + ': ' + ex.message);
break;
}
textStatus = 'success';
success(data, textStatus);
break;
default:
textStatus = 'success';
success(this.responseText, textStatus);
}
} else {
error(this, textStatus, null);
}
complete(this, textStatus);
};
req.open(options.type, url, true);
if (options.type.toUpperCase() == 'POST'){
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.send(dataString);
} else {
req.send();
}
req = null;
};
答案 4 :(得分:-2)
您需要在客户端处理条件以检查状态代码。您可以按如下方式获取状态:
success: function(data, textStatus, xhr) {
console.log(xhr.status);
},