我正在实现各种信息的队列系统。当它达到一定数量时,我发送一个ajax请求....用户输入数据,当它到达我发送的某个点时。但是,用户仍然可以输入数据。我不想失去那个..所以,我想我可以使用$.Deferred/promise
,同时将数据存储到某个点...解雇ajax,并且只允许新的请求,当前一个延迟是成功...同样,如果输入的数据然后增加到我必须再次发送的点,我就把它弄错..
我很难将我的大脑围绕着如何实施的方法。
===>捕获数据
=======>输入'n'数据量
=============>将该数据移动到“准备好”的桶中。 (任意,让用户输入10个输入字段,然后存储到数组中。当数组达到10时,繁荣发送它。)
=============>用10个项目点燃ajax
与此同时,用户仍然可以输入数据。我想确保我仍然捕获它并继续排队并在10点发送。
我在想一个延迟的排队系统。不确定我是不是在想这个。
答案 0 :(得分:3)
由于$.ajax()
返回的jqXHR对象是Promise,因此可以使用。
var data = {
// captured data goes here
};
function sendData( val ){
// jqXHR object (which contains a promise)
return $.ajax('/foo/', {
data: { value: val },
dataType: 'json',
success: function( resp ){
// do whatever needed
}
});
}
function when(){
$.when(sendData(data)).done(function (resp) {
when();
});
}
when(); // use this within the if switch
答案 1 :(得分:2)
假设您的队列是数组dataQueue
,那么您可以执行以下操作:
var dataQueue = [];//sacrificial queue of items to be sent in batches via AJAX request
var batchSize = 10;
var requesting = false;//flag used to suppress further requests while a request is still being serviced
//addToQueue: a function called whenever an item is to be added to he queue.
function addToQueue(item) {
dataQueue.push(item);
send();//(conditional on queue length and no request currently being serviced)
}
function send() {
if(dataQueue.length >= batchSize && !requesting) {//is the queue long enough for a batch to be sent, and is no ajax request being serviced
$.ajax({
url: '/path/to/server/side/script',
data: JSON.stringify(dataQueue.splice(0, batchSize)),//.splice removes items from the queue (fifo)
... //further ajax options
}).done(handleResponse).fail(handleFailure).always(resetSend);
requesting = true;
}
}
function handleResponse(data, textStatus, jqXHR) {
//handle the server's response data here
}
function handleFailure(jqXHR, textStatus, errorThrown) {
//handle failure here
}
function resetSend() {
requesting = false;//Lower the flag, to allow another batch to go whenever the queue is long enough.
send();//Call send again here in case the queue is already long enough for another batch.
}
<强> DEMO 强>
注意:
send
返回jqXHR(或其他任何内容),但如果您的应用程序受益,请务必这样做。resetSend
不一定需要被称为.always
处理程序。从.done
处理程序(而不是.error
处理程序)调用会产生“因故障而死”的效果。