Javascript 两个ajax调用,只有一个正在运行
我有以下返回对象的http变量:Javascript 两个ajax调用,只有一个正在运行,javascript,ajax,Javascript,Ajax,我有以下返回对象的http变量: var http = (function(){ var success = null; var error = null; var requestInfo = {content: '', status: 0}; var core = { request: function(options){ var $http = Object.create(http); sen
var http = (function(){
var success = null;
var error = null;
var requestInfo = {content: '', status: 0};
var core = {
request: function(options){
var $http = Object.create(http);
sendRequest(options).then(function(){
if(typeof(success) == 'function'){
success(requestInfo.content);
}
}, function(){
if(typeof(error) == 'function'){
error(requestInfo.content);
}
});
return $http;
},
success: function(callback){
success = callback;
return this;
},
error: function(callback){
error = callback;
return this;
}
};
function sendRequest(options){
return new Promise(function(resolve, reject){
var xhttp = new XMLHttpRequest();
var method = options.method.toUpperCase();
xhttp.onreadystatechange = function() {
if(xhttp.readyState == 4){
requestInfo.content = JSON.parse(xhttp.responseText) || xhttp.responseText;
requestInfo.status = xhttp.status;
}
if (xhttp.readyState == 4 && xhttp.status == 200) {
resolve(requestInfo);
}else if(xhttp.readyState == 4 && xhttp.status != 200){
reject(requestInfo);
}else if(xhttp.status >= 400){
reject(requestInfo);
}
};
xhttp.open((method || 'GET'), options.url, true);
var data = options.data || '';
xhttp.setRequestHeader('X-CSRF-TOKEN', document.querySelector('meta[name="csrf-token"]').getAttribute('content'));
if((typeof(data) == 'object' && (Object.keys(data).length > 0) || data.length > 0)){
xhttp.send(JSON.stringify(data));
}else{
xhttp.send();
}
});
}
return core;
})();
如果我不止一次同时调用它,就像这样:
http.request({url: '/path1'}).success(function(){
alert('success');
});
http.request({url: '/path2'}).success(function(){
alert('success');
});
只有一个项目通过ajax传递,而另一个项目没有。这是什么原因造成的?我认为做Object.create(这个)
会使每个对象彼此独特,但它似乎没有做到这一点
方法创建具有指定原型对象和属性的新对象
因此,您使用相同的原型创建了两个对象,并且数据在原型本身中。由于原型是一个对象,并且是相同的,因此两个结果对象对其数据对象和函数具有相同的引用
您不需要在prototype对象中指定数据,而是为每个实例指定数据
因此,在创建
var$this=Object.create(this)之后
,则必须将数据添加到$this
,例如successFunc
,否则下一次调用将覆盖此数据。用于存储回调函数的success
和error
变量必须在request
函数中创建,以便每个请求真正唯一。但是,如果您打算使用承诺,我建议使用XMLHttpRequest
对象可用的load
和error
事件侦听器简化整个过程(MDN的文章中有一个很好的例子)只需将成功和失败函数传递给Promise实例的然后
方法
下面是一个使用超时模拟500毫秒HTTP请求的简化示例。问题在于这一行:
var method = options.method.toUpperCase();
我没有在选项
中设置方法
属性,并且说它无法发送也没有错,它基本上只是在没有警告的情况下退出了方法
我把它改成这样:
var method = (options.method || 'GET').toUpperCase();
它开始工作。您的代码按原样工作,问题一定在ajax对象中。
创建(此)
只创建一个新对象,其原型链中包含原始的核心。因此,任何访问$this
对象的未定义成员的尝试都将搜索其原型this
,并使用其成员(如果已定义)。假设您希望成功和错误回调唯一的对等请求,请尽快回答。。。(移动应用程序不适合代码示例lvar success=null;var error=null;var requestInfo={content:'',状态:0}这是您的问题。只需将其存储在$this上。sendRequest是否在当前对象上运行而不是在新创建的对象上运行?我们可以从以下几点着手:现在,您的两个请求都已完成,但第二个请求的数据将发送到第一个对象的回调,而第二个对象的回调没有获得任何数据。因此e肯定是一个引用问题。我最初怀疑这样的问题,但我无法立即重新创建该问题。您需要执行超时或其他操作,以便让第二条指令运行。您将看到,在调用超时时,两者至少具有完全相同的回调函数。我不确定Promise
但是,我确信它对AJAX请求也会这样做,因为代码没有其他问题。我在模拟的//AJAX东西中有100毫秒的超时,我收到两个警报,一个是1,第二个是2(由传递给.success的回调设置)我的做法有什么不同?@KevinB我为reference@KevinB那是出乎意料的。那时我的答案可能不正确。它似乎工作得很好。