2013-06-22 78 views
0

我在jQuery中查看Deferred對象。 我在想的是如何在特定請求之前調用一個請求隊列,但只有在最後一個請求之後才能解析。使AJAX隊列稍後解析請求

我解釋一下:

我將標籤。每次插入標籤時,我都應該通過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

看起來像你的邏輯失敗的地方。爲什麼不在ajaxReq(id)之前調用generateId()?爲什麼不只使用一個請求?你能提供一個具體的例子嗎? –

+0

因爲我需要避免在我的數據庫中無用的表。如果用戶沒有插入標籤或者執行我需要填寫與生成的ID相關的表格的任何操作,則創建一個表格是沒有用的。 – steo

回答

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/一個工作的例子

+0

我很感謝你的回答,這是解決問題的好方法。無論如何,我只需要所有標籤的唯一ID。 – steo

+0

我在考慮一個事實:根據我們使用數組的事實,每個請求只能推送一個標籤,是否必須爲每個標籤發出請求? – steo

+0

@steo我會加強以顯示每個標記的一個AJAX請求 – Alnitak

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/

+0

我不認爲這個用例可以使用鏈接來處理,因爲鏈接等待上一個函數完成。 – face

+0

OP大多隻需要解耦他的數據處理和AJAX請求。他的「插入」需要進入本地數據結構,並且只有在數據結構被提交(通過AJAX)到數據庫時纔會確定「id」。這幾乎是我的答案所描述的。 – Alnitak

+1

ps.s.沒有必要在代碼中調用'.promise()'。該函數的唯一目的是返回一個具有完整'$ .Deferred'功能_subset_的對象,因此可以被_observed_而不是_modified_。 – Alnitak