创建一个AJAX队列以便稍后解决请求

时间:2013-06-22 12:38:26

标签: jquery ajax concurrency deferred

我正在查看Deferred中的jQuery个对象。 我正在考虑的是如何建立一个在特定请求之前调用的请求队列,但是应该只在最后一个请求之后解析。

我解释说:

我正在插入标签。每次插入标签时,我都应该通过AJAX请求将其插入数据库。要发出此AJAX请求,我需要id由另一个AJAX请求生成,我稍后会调用该请求。

我认为可以通过.promise()来解决,但我不明白它是如何运作的。

以下是我想要实现的伪代码中的示例:

ajaxReq(id) //is called every time I insert a tag
generateId() //this generate the id a need

when generateId is called -> ajaxReq is resolved (even if i "called" it before)

2 个答案:

答案 0 :(得分:3)

您的信息流似乎不正确。你只是不能发出“第一个”AJAX请求,直到第二个请求完成并分配了ID。

实质上,您只需要等待提交的本地标签列表:

var tags = [];

以及向列表添加标记的方法:

// Add a new tag to the queue
function makeTag() {
    tags.push(...);
}

您可以立即执行任何不依赖于id的值的代码。

一段时间后,某些事件将导致此“信息”的“提交”。你需要获得一个ID:

function generateID() {
    return $.ajax(...);
}

并且您需要一个函数来处理该ID并实际将数据提交到数据库,在这种情况下,每个标记进行一次AJAX调用:

function commitOneTag(id, tag) {
    return $.ajax(...);   
}

function commitTags(id) {
    return (function loop() {
        var tag = tags.shift();
        if (tag) {
            return commitOneTag(id, tag).then(loop);
        }
    })();
}

然后将它们连在一起的方式:

makeTag();
makeTag();

generateID().then(commitTags).done(function() {
    // processing will continue here once the entire
    // AJAX chain has been completed
 });

这是使用.then来允许“链接”承诺。

有关实例,请参阅http://jsfiddle.net/alnitak/5BHXt/

答案 1 :(得分:2)

哇!我第一次看promise()方法,我已经印象深刻了。对于你的逻辑,我认为伪代码可以这样写:

$(document).ready(function(){
var myDeferredObj = $.Deferred();
var ajaxReq = function(){
    // Initial part of logic that does not need id
    alert('here');
    myDeferredObj.promise().done(function(args1, args2) {
        alert(args1 + ':' + args2);
        // Use id provided by generateID
    });
};

var generateID = function(){
    //get ID
    id = 5;//suppose
    alert('generate');
    myDeferredObj.resolveWith(this, [id, id]);
}

ajaxReq();
generateID();
});

这对我来说很好!小提琴 - http://jsfiddle.net/569LL/