我正在进行一个REST DELETE调用,返回204.在jQuery 1.8.3中,这有效,并命中request.done回调.但是如果我使用1.9,那么它会在textStatus中使用parsererror发送到request.fail,并在errorThrown中使用'SyntaxError:意外的输入结尾'.
remove = function (complete) {
var self = this;
var request = $.ajax({
context: self,
url: "/v1/item/" + itemId,
dataType: "json",
type: "DELETE"
});
request.done(removeCallback);
request.fail(function (xhr, textStatus, errorThrown) {
alert(errorThrown);
});
},
Run Code Online (Sandbox Code Playgroud)
任何人都知道1.9中会发生什么变化导致失败,以及为了解决这个问题需要改变什么?
所以,回答我自己的问题,看起来这实际上是问题所在:
jQuery.ajax返回空字符串的JSON结果
在1.9之前,期望返回数据类型为JSON或JSONP的ajax调用会将空字符串的返回值视为成功案例,但会将null返回给成功处理程序或promise.从1.9开始,为JSON数据返回的空字符串被认为是格式错误的JSON(因为它是); 这将导致错误.使用错误处理程序来捕获此类情况.
所以,如果删除dataType
dataType: "json",
Run Code Online (Sandbox Code Playgroud)
它适用于jQuery 1.8.3和1.9.
Noe*_*ams 21
HTTP 204响应不是空字符串:它表示没有数据.这是删除和更新操作的有效响应.
这看起来像是JQuery 1.9中引入的错误.
删除dataType属性的原因是因为当它设置为"json"时,JQuery会尝试使用JSON.parse解析内容并因此失败.从机票:
对于除"json"之外的任何其他数据类型,这不会失败,因为回归是由于parseJSON与本机JSON.parse重新对齐(抛出null/undefined值的异常).
不要尝试通过statusCode属性为204添加处理程序的故障单中建议的变通方法,因为将触发该处理程序和错误处理程序.可能的解决方案如下:
$.ajax(url, {
type: "DELETE",
dataType: "json",
error: function (error) {
if (error.status === 204) {
// Success stuff
}
else {
// fail
}
}});
Run Code Online (Sandbox Code Playgroud)
我遇到了一个非常类似的问题,你帮我找到了答案 - 谢谢你.我的解决方案略有不同,所以我想我会分享它.
如问题中所述,在JQuery网站上它说:
在1.9之前,期望返回数据类型为JSON或JSONP的ajax调用会将空字符串的返回值视为成功案例,但会将null返回给成功处理程序或promise.从1.9开始,为JSON数据返回的空字符串被认为是格式错误的JSON(因为它是); 这将导致错误.使用错误处理程序来捕获此类情况.
我将JSON数据传递给我的服务器上的方法,其中"void"作为返回类型,因为我不需要对success函数中的返回数据执行任何操作.在JQuery 1.9 +中的AJAX请求中传递JSON时,您不能再返回null.然而,这在以前版本的JQuery中是可能的.
要停止获取错误并获取成功函数,您必须在AJAX请求中返回有效的JSON.你传递的内容并不重要,只要它是有效的,因为(在我的情况下,无论如何)你没有使用返回的数据.
| 归档时间: |
|
| 查看次数: |
11891 次 |
| 最近记录: |