2013-08-22 50 views
0

我試圖創建一個函數,通過ajax來請求關於我們數據庫中的國家/地區ID的信息,因爲這是我查詢的address表中數據的表示方式。也就是說,在address表中,代表該國的id,而不是國家名稱,實際的國家名稱位於我查詢的另一個表中。Coffeescript不遍歷整個對象

當我發送ajax請求後,我創建了一個我得到的地址字符串。但是,它只更新對象的最後一個值,而不是全部。這裏是我的咖啡腳本:

requests = Array() 
for key, val of {'Correspondence_Country__c':data['Correspondence_Country__c'], 'Country_of_Residence__c': data['Country_of_Residence__c']} 
     console.log(key) 
     console.log(val) 
     requests.push($.ajax 
       url: window.location.pathname 
       type: 'post' 
       dataType: 'json' 
       data: 'search_id=' + val + '&search_column=Id&sobject=Country__c&columns=["Name"]' 
       error: (jqXHR, textStatus, errorThrown) -> 
         alert('Error: ' + textStatus + ': ' + errorThrown) 
       success: (c_data, textStatus, jqXHR) -> 
         data[key] = c_data['Name'] 
         console.log(c_data['Name']) 
         console.log(key) 
     ) 
defer = $.when.apply($, requests) 

我省略了defer.done函數。的信息的console.log的結果如下:

China P.R. 
Country_of_Residence__c 
China P.R. 
Country_of_Residence__c 

,而不是被預期的

China P.R. 
Correspondence_Country__c 
China P.R. 
Country_of_Residence__c 

是否有與我的CoffeeScript的問題嗎?

編輯:它看起來像它的東西做的ajax請求或推ajax請求到requests陣列。我加了一對夫婦console.log()在函數的開始,我推ajax呼叫之前,它產生了以下信息:

Correspondence_Country__c 
a063000000CZoZHAA1 
Country_of_Residence__c 
a063000000CZoZHAA1 
+1

[循環是表達式],而不是使用'requests.push'內(http://coffeescript.org/#loops)中的CoffeeScript所以你可以說'請求=關鍵的VAL ...'循環。 –

+0

感謝你的提問,我之前正在研究如何延遲一個函數,直到完成所有的ajax請求,並且我使用了我找到的Stack Overflow示例。我不知道我能做到這一點。 – josh

回答

2

$.ajax是異步的(除非特別指出,但你不希望)。這意味着循環將在ajax調用完成之前結束。當ajax調用最終結束時,「key」將是數組的最後一個值。 (JS沒有塊範圍)。使用咖啡do保持正確的值。

for key, val of {'Correspondence_Country__c':data['Correspondence_Country__c'], 'Country_of_Residence__c': data['Country_of_Residence__c']} 
    do (key) -> 
    # your code 
+0

我可能會把'val'放入'do'中。 val的使用方式意味着你不需要這樣做,但這樣做可能會避免一些困惑的表情。 –

+0

那麼,因爲val不是異步使用(並且沒有明顯的理由),所以我寧願避免捕獲超過需要的數據。 – Ven