Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个ajax调用,只有一个正在运行_Javascript_Ajax - Fatal编程技术网

Javascript 两个ajax调用,只有一个正在运行

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

我有以下返回对象的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);
            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
,并使用其成员(如果已定义)。假设您希望成功和错误回调唯一的对等请求,请尽快回答。。。(移动应用程序不适合代码示例l
var success=null;var error=null;var requestInfo={content:'',状态:0}这是您的问题。只需将其存储在$this上。sendRequest是否在当前对象上运行而不是在新创建的对象上运行?我们可以从以下几点着手:现在,您的两个请求都已完成,但第二个请求的数据将发送到第一个对象的回调,而第二个对象的回调没有获得任何数据。因此e肯定是一个引用问题。我最初怀疑这样的问题,但我无法立即重新创建该问题。您需要执行超时或其他操作,以便让第二条指令运行。您将看到,在调用超时时,两者至少具有完全相同的回调函数。我不确定
Promise
但是,我确信它对AJAX请求也会这样做,因为代码没有其他问题。我在模拟的
//AJAX东西中有100毫秒的超时,我收到两个警报,一个是1,第二个是2(由传递给.success的回调设置)我的做法有什么不同?@KevinB我为reference@KevinB那是出乎意料的。那时我的答案可能不正确。它似乎工作得很好。