我需要捕获所有的ajax请求。我用jQuery
like here
$(document).ajaxSend(function (event, req, settings) {
console.log('Request Sent');
});
$(document).ajaxComplete(function (event, req, settings) {
console.log('Request Completed');
});
而且我可以有一些重复的请求(使用相同的网址)。也许使用相同的数据。
Simple example
在这里,我两次调用loadBBC()。
问题:如何为第一个loadBBC和第二个loadBBC标识(匹配)ajaxSend / ajaxComplete?
我只想将所有request_1 / response_1,request_2 / response_2保存在一起。不是request_1,request_2,response_2,response_1
我不能将settings.url或settings.data用作唯一值,因为它们可以重复。
谢谢
最佳答案
如果我对您的理解正确,那么您正在寻求通过唯一值关联您的请求和响应。
您可以在jquery.ajax上使用上下文。这意味着您将不得不“放弃”加载,但是由于它实际上是围绕ajax的包装,因此您只需进行一点输入就不会丢失任何内容。
这是使用您提供的类似代码的示例。
$(function () {
// Ensure if our request context doesn't have an ID we at least get something back.
function getContextRequestID(settings, defaultIfNotSet)
{
if (typeof settings.context.requestID !== "undefined")
{
return settings.context.requestID;
}
return defaultIfNotSet;
}
function writeToJsResult(method, settings)
{
var DefaultRequestID = -1;
var requestID = getContextRequestID(settings, DefaultRequestID);
$(".js-result").append('<p>' + method + ': Ajax request for page --> ' + settings.url + ' with ID of: ' + settings.context.requestID + '</p>');
}
$(document).ajaxSend(function (event, jqxhr, settings) {
writeToJsResult("Starting", settings);
});
$(document).ajaxError(function (event, req, settings) {
writeToJsResult("Error", settings);
});
$(document).ajaxComplete(function (event, req, settings) {
writeToJsResult("Complete", settings);
});
/* triggering all Ajax requests */
$('.js-btn-json').on('click', function () {
loadBBC();
loadBBC();
});
function loadBBC()
{
loadSite("http://www.bbc.com");
}
function loadCNN()
{
loadSite("http://www.cnn.com");
}
function loadSite(url)
{
// Not sure how you want to correlate them. For now using random.
// Perhaps a global running counter
// Perhaps a GUID/UUID
// http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
var requestID = getRandomInt(0, 100);
$.ajax({
url: url,
context: {
requestID: requestID
}
});
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
});