如果我有类似的东西:
var result;
var searchFunction = function(query) {
$.ajax({
url: '..',
type: 'GET',
data: {
'query': query
},
success: function(result) {
r = result
}
});
};
r
是否总是最后一次 searchFunction(query)
调用的结果?
例如,假设我这样做:
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 调用的结果,您可以自己编写一堆自定义编码来按顺序跟踪结果,或者您可以使用 Async 或 Promise 等第三方库。
如果您要解决的实际问题是某种增量搜索,您可能同时有多个请求,并且您不想处理比您已经处理过的请求更旧的请求收到,那么您需要创建一个系统来跟踪排序,以便您知道何时忽略响应。有多种方法可以解决这个问题:
- 每次发送新请求时,您都可以中止之前的任何请求。
- 您可以使用单调递增的数字标记每个请求,然后跟踪迄今为止已处理的最高响应数字,并忽略数字较小的响应数字。
仅供引用,如果您的服务器同步处理每个请求(因此它从第一个到达的请求开始,并且在第一个请求完成之前无法处理任何其他请求)并且一次只能处理一个请求,那么它可能只以 FIFO 顺序返回结果,无论每个请求需要多长时间。另一方面,如果您的请求处理是异步的,或者您的服务器可以一次处理多个请求,那么执行时间最短的请求将首先返回。
关于javascript - jQuery-ajax 响应是否按顺序收到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26520481/