Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.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_Asp.net Ajax - Fatal编程技术网

Javascript Ajax同时处理多个请求

Javascript Ajax同时处理多个请求,javascript,asp.net-ajax,Javascript,Asp.net Ajax,最近我开发了一个项目,在一个aspx页面上发送多个ajax请求。我还设置了一个计时器,以5秒为间隔执行此请求。 一切似乎都很顺利,直到突然反应混乱。我知道我可以用一个请求做同样的事情,但我想知道为什么会发生这种情况。我环顾了一下互联网,但还没有找到任何解决办法。我现在实际上采用了这种编码风格,比如发出一个带有多个结果的请求,但我想知道,我真的想知道,如果响应不会混淆,如何发出多个ajax请求。 这是我的示例代码: $(document).ready(function () {

最近我开发了一个项目,在一个aspx页面上发送多个ajax请求。我还设置了一个计时器,以5秒为间隔执行此请求。 一切似乎都很顺利,直到突然反应混乱。我知道我可以用一个请求做同样的事情,但我想知道为什么会发生这种情况。我环顾了一下互联网,但还没有找到任何解决办法。我现在实际上采用了这种编码风格,比如发出一个带有多个结果的请求,但我想知道,我真的想知道,如果响应不会混淆,如何发出多个ajax请求。 这是我的示例代码:

 $(document).ready(function () {
        var a = setInterval("request1()", 5000);
        var b = setInterval("request2()", 5000);
    });

function request1() {

        $.ajax({
            url: 'ajaxhandler.aspx?method=method1' ,
            beforeSend: function (xhr) {
                xhr.overrideMimeType('text/plain; charset=utf-8');
            },
            success: function (data) {
                  alert(data);
            }

        });
    }


function request2() {

        $.ajax({
            url: 'ajaxhandler.aspx?method=method2' ,
            beforeSend: function (xhr) {
                xhr.overrideMimeType('text/plain; charset=utf-8');
            },
            success: function (data) {
                  alert(data);
            }

        });
    }

如果需要按顺序执行请求,则不应该使用AJAX(第一个“a”表示“异步”)

为了解决这个问题,您可以在回调中调用request2(),以获得第一个请求的“成功”

function request1() {
    $.ajax({
        url: 'ajaxhandler.aspx?method=method1' ,
        beforeSend: function (xhr) {
            xhr.overrideMimeType('text/plain; charset=utf-8');
        },
        success: function (data) {
              request2();
        }

    });
}

这不是JavaScript的错误,这是一个混乱,因为您在同一时间调用单个页面。如果您的两个AJAX文件有两个服务器端页面,那么就可以了。尝试为不同的
方法创建两个不同的
aspx
文件,以便将它们一起调用

但这不是一个好的做法。为什么不将方法作为参数发送,并在
aspx
文件中为不同的方法设置条件?然后,如果您同时使用了两个(或更多)方法,只需通过一个调用将这两个方法发送到服务器即可。您将为您的呼叫保存HTTP标头和呼叫延迟

function requestAll() {

        $.ajax({
            url: 'ajaxhandler.aspx' ,
            data: ['method1', 'method2'],
            beforeSend: function (xhr) {
                xhr.overrideMimeType('text/plain; charset=utf-8');
            },
            success: function (data) {
                  alert(data);
            }

        });
    }

如前所述,您不能保证结果返回的顺序。但是,如果有必要确定这一点,您可以为发出的每个异步请求创建一个唯一的标识符,然后相应地对传入的响应进行排序

我认为这种解决方案很有用的一个例子是在击键时执行操作(例如onkeyup)。在执行类似操作时,您可能希望对时间戳、版本号或类似内容进行编码,以便保证某种顺序。如果用户试图搜索“test”,则“te”的自动完成响应可能会在“te”的响应之前返回。如果您只是覆盖自动完成数据,那么这显然不是您想要的行为,因为您可能会为当前搜索标记显示不正确的结果


编码时间戳(或唯一ID、计数器、版本号、密钥等)将允许您进行检查,以验证您是否有最新的响应,或者根据时间戳对结果进行排序(如果需要保证顺序等)。

下面的函数将接受JSON请求的URL数组,并在所有请求完成后使用结果数组调用回调。它可以很容易地适应非JSON使用

其思想是在传入响应到达时将其隐藏到数组中,然后仅在所有结果都返回后调用回调。这种方法是一种很好的方法,可以批量更新DOM,并避免为每个要更新的节点设置计时器

function multi_getJSON(urls, callback)
{
    // number of ajax requests to wait for
    var count = urls.length;

    // results of individual requests get stuffed here
    var results = [];

    // handle empty urls case
    if(count === 0)
    {
        callback(results);
        return;
    }

    urls.forEach(function(url, index)
    {
        $.getJSON(url, function(data)
        {
            results[index] = data;
            count = count - 1;

            // are we finished?
            if(count === 0)
            {
                callback(results);
            }
        });
    });
}

搞混了?在异步环境中,不能保证首先返回哪个调用。