Javascript jQuery—ajax响应是否按顺序接收?

Javascript jQuery—ajax响应是否按顺序接收?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,如果我有类似于: var result; var searchFunction = function(query) { $.ajax({ url: '..', type: 'GET', data: { 'query': query }, success: function(result) { r = result } }); }; v

如果我有类似于:

var result;

var searchFunction = function(query) {
    $.ajax({
        url: '..',
        type: 'GET',
        data: {
            'query': query
        },
        success: function(result) {
            r = result
        }
    });
};
var resultSet = [];

var searchFunction = function(query) {
    $.ajax({
        url: '..',
        type: 'GET',
        data: {
            'query': query
        },
        success: function(result) {
            resultSet.push(result);
        }
    });
};
r是否总是最后一次searchFunctionquery调用的结果

例如,假设我这样做:

searchFunction('query1'); // this one takes 3 seconds to return because of internet delay
searchFunction('query2'); // this one takes 1 seconds to return because of less internet delay
我的r是“result1”还是“result2”

因为它应该是一个异步AJAX,所以我希望r='result1',但是从我做的一些测试中,我得到了r='result2'


真正发生了什么?

异步Ajax调用可以以任何顺序返回。你不能依赖订单。您只能在特定ajax调用的完成处理程序中可靠地使用ajax调用的结果,或者在您调用并将结果从完成处理程序传递给的某个函数中可靠地使用ajax调用的结果

您绝对不希望将ajax结果放入全局变量中,然后再尝试从全局变量中使用它们。这是一个定时灾难的配方,从来不是编码它的好方法

如果您想协调多个ajax调用的结果,您可以自己进行一系列自定义编码,以便按顺序跟踪结果,或者可以使用第三方库,如Async或Promissions

如果您试图解决的实际问题是某种增量搜索,您可能同时有多个请求,并且您不想处理比您已经收到的请求更旧的请求,然后,您需要创建一个跟踪排序的系统,以便知道何时忽略响应。有许多方法可以实现这一点:

每次发送新请求时,都可以中止以前的任何请求。 您可以用一个单调递增的数字标记每个请求,然后跟踪到目前为止处理的最高响应数,忽略任何数字较低的响应数。 仅供参考,如果您的服务器同步处理每个请求,因此它从到达的第一个请求开始,并且在第一个请求完成之前无法处理任何其他请求,并且一次只能处理一个请求,那么它可能只会以FIFO顺序返回结果,而不管每个请求需要多长时间。另一方面,如果您的请求处理是异步的,或者您的服务器一次可以处理多个请求,那么执行时间最短的请求将首先返回。

您正在设置的r是什么?不管怎样,根据定义,您不能期望AJAX异步以任何顺序发生。如果您要拨打多个电话,并希望存储所有响应,您将需要执行以下操作:

var result;

var searchFunction = function(query) {
    $.ajax({
        url: '..',
        type: 'GET',
        data: {
            'query': query
        },
        success: function(result) {
            r = result
        }
    });
};
var resultSet = [];

var searchFunction = function(query) {
    $.ajax({
        url: '..',
        type: 'GET',
        data: {
            'query': query
        },
        success: function(result) {
            resultSet.push(result);
        }
    });
};

AJAX响应将按照响应到达的顺序进行处理。它们的发送顺序无关紧要。我已经修改了您的代码来记录响应,您可以在Javascript控制台中看到,快速查询首先被处理

var searchFunction = function(query, delay) {
    $.ajax({
        url: '/echo/json/',
        type: 'POST',
        data: {
            json: JSON.stringify(query),
            delay: delay
        },
        success: function(r) {
            console.log(r);
        }
    });
};

searchFunction('query1', 3);
searchFunction('query2', 1);

Ajax中的第一个字母代表异步,这意味着操作是并行进行的,完成的顺序没有保证。实际上,我通过设置一个全局索引变量并在每个请求中递增它来解决这个问题,然后我将它复制到函数块中的一个局部变量中,这样我就可以在成功块中比较它,与第二个解决方案类似,但没有第二个解决方案那么优雅。但也许我不清楚,我的问题不是并发问题是否存在以及如何解决它,我的问题是这个并发问题存在吗?因为我似乎无法重现它。当我手动执行这两个请求并在服务器上强制执行这些延迟时,结果1总是在结果2之前返回。尽管我也非常想知道如何实现您的两个解决方案。@RodrigoRuiz-您可以看到这里重现的问题:-响应返回的顺序与发送的顺序相反。有些问题取决于服务器中的实现。如果服务器一次只同步提供一个请求,那么它可能会按照请求的顺序返回结果。但是,在多请求服务器或异步架构(如node)中,完成的第一个请求就是返回的第一个请求。我接受你的回答,因为我认为这可能是因为我在Heroku中只有一个dyno,所以可能是同步服务器,但请在您的答案中添加最后一条评论。一种方法是在发送新请求之前中止以前的请求…实际上我认为我知道如何解决这种并发问题,我只是想知道在这个特定的web案例中到底发生了什么。嗯,我不知道“/echo/json/”对我的无知表示抱歉,但在我的真实服务器中,情况并非如此,延迟实际上是由于数据库访问而在服务器中发生的。/echo/json/是jsfiddle上用于测试AJAX的AJAX服务器。在您的实际应用程序中,可能数据库中的某些内容正在序列化两个查询,因此快速查询正在等待慢速查询完成。实际上,r只是我简化它的方法,我实际上要做的是用该结果重新填充一个表。我也知道我不应该期望回复中有任何顺序,但为什么回复的顺序与我发送的顺序相同呢?即使 不同的延迟。。。