检查所有Ajax请求何时完成-纯JavaScript

检查所有Ajax请求何时完成-纯JavaScript,javascript,ajax,request,Javascript,Ajax,Request,我知道这个方法 如果jQuery不可用,有没有办法用纯JavaScript实现这一点 如果有的话,你能举个例子吗 干杯javascriptabort()方法 供参考 很好,我会咬一口(尽管你连试都不试是很懒的): 从: 每当Ajax请求完成时,jQuery都会检查是否存在任何其他未完成的Ajax请求。如果没有剩余,jQuery将触发ajaxStop事件。此时将执行使用.ajaxStop()方法注册的所有处理程序 那么你需要什么呢?好的:一个用于执行AJAX请求的中央API(某种模块)。在此模块

我知道这个方法

如果jQuery不可用,有没有办法用纯JavaScript实现这一点

如果有的话,你能举个例子吗

干杯

javascript
abort()方法
供参考

很好,我会咬一口(尽管你连试都不试是很懒的):

从:

每当Ajax请求完成时,jQuery都会检查是否存在任何其他未完成的Ajax请求。如果没有剩余,jQuery将触发ajaxStop事件。此时将执行使用.ajaxStop()方法注册的所有处理程序

那么你需要什么呢?好的:一个用于执行AJAX请求的中央API(某种模块)。在此模块中,您必须跟踪挂起的请求,并在请求终止后将其删除。
如果队列(可以说)是空的,那么您可以检查
ajaxStop
队列中是否有任何已注册的回调,并调用这些回调

基本设置(伪代码)如下所示:

var myAjax = (function()
{//create closure scope to track ajax requests
    var activeRequests = [],
        stopQueue = [],
        ajaxModule = {},//the module itself
        createXhr = function(){};//function to create XHR requests
    ajaxModule.ajax = function(params, callback)
    {
        var xhr = createXhr(params),
            key = activeRequests.length;
        activeRequests.push(xhr);//add to active array
        xhr.onreadystatechange = function()
        {//assign internal handler
            if (this.readyState === 4 && this.status === 200)
            {
                //invoke passed callback only if request is done
                callback.call(this, []);//pass params as you please
                activeRequests.filter(function(e)
                {
                     return e !== this;
                }, this);//define this callback in closure, of course
                if (activeRequests.length === 0)
                {//no more active requests
                    stopQueue.map(function(callback)
                    {
                        callback();//invoke callbacks
                    });
                }
            }
        };
    };
    return ajaxModule;//expose module
}());

当然,您仍然需要实现管理stopQueue回调的函数,您还需要自己实现一个可靠的AJAX模块,但这是您可以使用的简单设置。

您可以查看jQuery源代码,了解它在那里的处理方式……是的,您可以在没有jQuery的情况下完成这项工作。。。其实也没那么难。这就是问题所在吗?或者你希望我们教你怎么做?你能告诉我怎么做吗?这的确是一个问题。如果你举一个简短的例子,这会有所帮助。
var httpRequest = null;
function sentReq() {
            if (!httpRequest) {
                httpRequest = CreateHTTPRequestObject ();   
            }
            if (httpRequest) {          

                var url = "file.php";

                httpRequest.open ("GET", url, true);  
                httpRequest.onreadystatechange = OnStateChange;
                httpRequest.send (null);
}

function abort(){
  if(httpRequest)
      httpRequest.abort();
}
var myAjax = (function()
{//create closure scope to track ajax requests
    var activeRequests = [],
        stopQueue = [],
        ajaxModule = {},//the module itself
        createXhr = function(){};//function to create XHR requests
    ajaxModule.ajax = function(params, callback)
    {
        var xhr = createXhr(params),
            key = activeRequests.length;
        activeRequests.push(xhr);//add to active array
        xhr.onreadystatechange = function()
        {//assign internal handler
            if (this.readyState === 4 && this.status === 200)
            {
                //invoke passed callback only if request is done
                callback.call(this, []);//pass params as you please
                activeRequests.filter(function(e)
                {
                     return e !== this;
                }, this);//define this callback in closure, of course
                if (activeRequests.length === 0)
                {//no more active requests
                    stopQueue.map(function(callback)
                    {
                        callback();//invoke callbacks
                    });
                }
            }
        };
    };
    return ajaxModule;//expose module
}());