0

我正在查看中的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)
4

2 回答 2

3

看来您的信息流不正确。在第二个请求完成并分配 ID 之前,您根本无法发出“第一个”AJAX 请求。

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

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/

于 2013-06-22T13:32:37.030 回答
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/

于 2013-06-22T13:15:34.067 回答