2011-07-27 94 views
1

我在一個循環中發出請求,試圖累積每次回送的對象的ID併發送到後續請求,以便它們不會第二次返回。但是,累加器變量(顯然)不在.ajax()成功回調之外,並且在傳遞給調用的數據對象時爲空。jQuery .ajax()回調作用域混淆

function fill_div(id, count) { 
    var rend = ""; 
    var filler = $('#'+id); 
    for(i = 0; i < count; i++) { 
     $.ajax({'type':'POST', 
       'url':'/ads/render/', 
       'dataType':'json', 
       'data':"rendered="+rend}).success(function(data){ 
        filler.append('<div id="' + data.adid + '"></div>'); 
        rend+=data.mid.toString()+","; 
        _fill_ad(data); 
       }); 
    } 
} 

當我看到在Chrome的檢查要求,該變量是有在後的數據,但沒有價值。我覺得自己正在面對範圍問題。

回答

3

它看起來像這裏的問題是,你希望返回的值被附加到rend字符串中的時間爲下一個AJAX調用。這不會發生,因爲調用是一個同步過程,但獲取返回值是異步的。相反的:

AJAX Post 1 (rend='') 
rend += 'id1,' 
AJAX Post 2 (rend='id1,') 
rend += 'id2,' 
AJAX Post 3 (rend='id1,id2,') 
// etc 

的序列將最喜歡去的東西,如:

AJAX Post 1 (rend='') 
AJAX Post 2 (rend='') 
AJAX Post 3 (rend='') 
// etc 
// ... data is returned, not necessarily in order 
rend += 'id2,' 
rend += 'id1,' 
rend += 'id3,' 
// etc 

爲了讓每個隨後的AJAX調用知道什麼是從服務器被以前返回,你不得不鏈這些呼叫,以便在前一個呼叫完成之前不會進行下一個AJAX呼叫。你可以用遞歸做到這一點,是這樣的:

function fill_div(id, count) { 
    var rend = ""; 
    var filler = $('#'+id); 
    // inner function for recursion 
    function doAjaxCall(i) { 
     $.ajax({'type':'POST', 
      'url':'/ads/render/', 
      'dataType':'json', 
      'data':{'rendered': rend}) 
      .success(function(data){ 
       filler.append('<div id="' + data.adid + '"></div>'); 
       rend+=data.mid.toString()+","; 
       _fill_ad(data); 
       // now send the next call 
       if (i < count) { 
        doAjaxCall(i+1); 
       } 
      }); 
    } 
    // kick off the series 
    doAjaxCall(0); 
} 
0

不知道這是問題,但不應該像這樣的POST?

function fill_div(id, count) { 
    var rend = ""; 
    var filler = $('#'+id); 
    for(i = 0; i < count; i++) { 
     $.ajax({'type':'POST', 
       'url':'/ads/render/', 
       'dataType':'json', 
       'data':{'rendered': rend}) 
       .success(function(data){ 
        filler.append('<div id="' + data.adid + '"></div>'); 
        rend+=data.mid.toString()+","; 
        _fill_ad(data); 
       }); 
    } 
} 

(不同的是,該「數據」是一個對象,而不是一個字符串)

+0

需要撕裂後,多了一個},但它不是一個問題 – Enki

0

功能fill_div執行時,存在初始化上

var rend = ""; 

並且當POST請求

'data':"rendered="+rend 

rend value will empty

你可以仔細檢查變量名嗎?

:)

+0

像我的理解是,如果計數爲3,第一次的數據將被'渲染='第二個'rendered = [midResult1],'和第三個'rendered = [midResult1],[midResult2],'。 – Enki