2012-04-24 96 views
2

我一直在做大量的搜索,并不认为我能找到我要找的东西。如何排队jQuery ajax请求?

我有一个类似于twitter的工作方式,你需要在一个按钮上单击一个按钮来添加(或在Twitter上关注)多个人。

因此,例如每次我点击下面的“添加”按钮,它都会发出一个AJAX请求,将它们添加到数据库中。现在

<ul> 
    <li>Ben <a href="#" onclick="return addPerson(1);">Add</a></li> 
    <li>Sarah <a href="#" onclick="return addPerson(2);">Add</a></li> 
    <li>Chantelle <a href="#" onclick="return addPerson(3);">Add</a></li> 
    <li>Alan <a href="#" onclick="return addPerson(4);">Add</a></li> 
</ul> 

如果我点击添加按钮的每个人,一个接一个,我不认为排队每人一个Ajax请求将是一个很好的利用资源。另外它会很慢。

我在想什么可能是延迟或沿着这些行后点击每个“添加”按钮。因此它记录了我点击的人的所有ID,并为所有点击的人发送了一个Ajax请求。

有没有现有的脚本,或者你能推荐我如何做到这一点?

+0

可能的:一个全局'boolean'变量来检查AJAX是否已经在运行;如果是这样,使用'setInterval()'继续检查,直到AJAX运行'complete()'后重置变量...未测试,但它应该在理论上工作。 – faino 2012-04-24 02:59:47

回答

3

会这样的伎俩吗?

var sendDelay; 
var peopleToSend = []; 
addPerson = function(id) { 
    if (sendDelay!=null) { 
     clearTimeout(sendDelay); // Clear timeout 
    } 
    sendDelay=setTimeout(addPersonDelayComplete,2000); // Reset timeout 
    peopleToSend.push(id); // Add person to array 
} 

addPersonDelayComplete = function() { 
    // Send the people in peopleToSend in a single ajax call here 
    peopleToSend.length = 0; // Reset the array 
} 
+0

什么传奇!真的很感谢,它可以在盒子里使用! – 2012-04-24 03:30:24

+0

但这个解决方案不考虑AJAX的状态。如果AJAX仍在加载之前的请求,该怎么办? – Raptor 2012-04-24 03:32:14

+0

@ShivanRaptor - 您可以同时在飞行中拥有多个ajax请求。 OP没有要求将其限制为只有一个Ajax请求。他们要求实施延迟,当延迟通过而没有添加任何新人时,然后使用自上次请求以来收集的所有新名称,发出ajax请求。 – jfriend00 2012-04-24 03:40:00