2017-01-30 50 views
0

如果我同时使用Ajax调用多个API,它非常慢,看起来javascript会一直等到获取所有API的响应,而不是异步获取响应。多个同时发生的Ajax请求很慢

例如, /api/test1响应在5秒内平常, 和/ api/test2响应在5秒内通常。

但是如果我在同一时间给他们打电话,它需要10秒。

例)需要10秒

$.get("/api/test1", function() { 
    self.responseHandler1(); 
}); 
$.get("/api/test2", function() { 
    self.responseHandler2(); 
}); 

因此,为了使加载速度我现在做的,

$.get("/api/test1", function() { // 5 sec 
    self.responseHandler1(); 
    $.get("/api/test2", function() { // 5 sec 
     self.responseHandler2(); 
    }); 
}); 

但我认为有一些更好的方式,请告诉我。

回答

1

您的代码

$.get("/api/test1", function() { 
    self.responseHandler1(); 
    $.get("/api/test2", function() { 
     self.responseHandler2(); 
    }); 
}); 

直到test1的被检索

此代码

$.get("/api/test1", function() { 
    self.responseHandler1(); 
}); 
$.get("/api/test2", function() { 
    self.responseHandler2(); 
}); 

并行

这检索两个请求没有得到测试2代码

$.when($.get("/api/test1"), $.get("/api/test2")).then(function(resp1, resp2) { 
    self.responseHandler1(); 
    self.responseHandler2(); 
}); 

使得并行的要求,但同时运行响应处理程序只有一次两个请求已经完成

作为测试(关于改变的代码的问题,下面的评论)

var x = Date.now(); 
$.get("/api/test1", function() { 
    self.responseHandler1(); 
}); 
console.log(x - Date.now()); 
$.get("/api/test2", function() { 
    self.responseHandler2(); 
}); 
console.log(x - Date.now()); 

记录到控制台的两个值应该是小数字(很容易少于100) - 如果它们不是,那么你的$.get不是异步的 - 我的jQuery知识很模糊,但我认为有一种方法可以使默认请求同步,可能是你的代码的某些部分所做的ne - 否则,问题出现在服务器上,可能无法处理同时发生的请求,或者是服务器上的api代码正在阻塞 - 无论哪种方式,如果记录的数字很小,问题就存在服务器

+0

如果我请求多个并行,它需要更多的时间。它可能是服务器端的问题? PHP无法同时处理多个请求? –

+0

是什么?你改变了这个问题中的代码 - 你说这两种方式需要10秒吗?也许服务器一次只能处理一个请求,因此串行/并行将不会产生变化 –