Javascript 未从重写的JQuery ajax XHR对象调用Done/Fail
我用我的自定义实现覆盖JQuery Ajax XHR对象,以便“伪造”服务器的请求和服务器的响应 我创建了一个简单的示例,展示了我在JS fiddle中试图实现的目标——在JS部分,我定义了一个非常简单的全局sendAjax函数,该函数假设使用$.ajax调用服务器:Javascript 未从重写的JQuery ajax XHR对象调用Done/Fail,javascript,ajax,jquery,jquery-deferred,Javascript,Ajax,Jquery,Jquery Deferred,我用我的自定义实现覆盖JQuery Ajax XHR对象,以便“伪造”服务器的请求和服务器的响应 我创建了一个简单的示例,展示了我在JS fiddle中试图实现的目标——在JS部分,我定义了一个非常简单的全局sendAjax函数,该函数假设使用$.ajax调用服务器: window.sendAjax = function() { var jqxhr = $.ajax({ url: "/ServerResource.txt" }); jqxhr.done
window.sendAjax = function() {
var jqxhr = $.ajax({
url: "/ServerResource.txt"
});
jqxhr.done(function (data, textStatus, jqXHR) {
//this is never called
alert("done !")
});
jqxhr.fail(function (jqXHR, textStatus, errorThrown) {
//this is never called
alert("fail " + errorThrown);
});
}
此外,我还尝试使用自己的xhr替换JQuery ajax xhr对象,在这里,我用自己的实现替换了“send”方法,该实现假设返回一些数据,而不是XHTPrequest——对于现在的JSFIDLE,我将立即返回“success”响应。问题是“完成”或“失败”功能根本不会对我的响应作出反应:
以下是我对XHR的重新定义
//reload jquery ajax
var originalXhr = jQuery.ajaxSettings.xhr;
$.ajaxSetup({
xhr: function () {
var req = originalXhr();
var deferred = $.Deferred();
var promise = deferred.promise(req);
if (req) {
// Add your progress handler
var _send = req.send;
req.send = function (headers, complete) {
//the one below does not work
setTimeout(function () {
deferred.resolve("Resolve promise", "OK", req);
}, 200);
}
var _open = req.open;
req.open = function () {
console.log('OPEN AJAX called');
}
}
return promise;
}
});
我可能做了一些事情,但延迟美元并没有按照我习惯的方式起作用,但我目前还不知道到底出了什么问题。
这是JS小提琴-也许你有一些想法
致以最良好的祝愿,Artem推迟返回;而不是回报承诺;jQuery.ajax调用没有有效的done选项,因此请删除该选项,看看会发生什么因为它没有ajax方法,所以不会工作——这是一个承诺,它用done、fail、always方法扩展ajax。我还编辑了上面的代码,删除了一个额外的done,但它也不能解决问题