我正在查看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)
答案 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
来允许“链接”承诺。
答案 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/