我用我的自定义实现覆盖了JQuery Ajax XHR对象,以便“伪造”服务器的服务器和服务器的响应。
我创建了一个简单的例子,我尝试在JS小提琴中实现 - 在JS部分我定义了非常简单的全局sendAjax()函数,假设使用$ .ajax()调用服务器:
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()'方法,假设返回一些数据而不是XHTTPrequest - 对于现在的JSfiddle,我将立即返回'成功'回应。问题是完成或失败的功能根本不会对我的响应做出反应:(
这是我对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;
}
});
我可能会做一些事情并且$ .Deferred不会以我不会的方式工作,但我无法想象到目前为止出了什么问题。 这是JS小提琴http://jsfiddle.net/ZwPXs/ - 你可能有一些想法吗?
致敬,Artem