2013-08-22 4 views
0

Я пытаюсь создать функцию для запроса информации о идентификаторе страны в нашей базе данных через ajax, так как данные представлены в запросе таблицы address. То есть в таблице address указывается id страны, а не название страны, а фактическое название страны находится в другой таблице, которую я запрашиваю.Coffeescript не перебирает весь объект

После отправки запроса ajax я создаю строку адреса, которую я получаю. Однако он обновляет только последнее значение объекта, а не все из них. Вот мой CoffeeScript:

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?

EDIT: Похоже, что это что-то делать с ajax запросов или раздвигая ajax запросы к requests массива. Я добавил пару console.log() в начале функции, прежде чем я нажал ajax вызов, и он произвел следующую информацию:

Correspondence_Country__c 
a063000000CZoZHAA1 
Country_of_Residence__c 
a063000000CZoZHAA1 
+1

[Петля выражение] (http://coffeescript.org/#loops) в CoffeeScript, так что вы могли бы сказать 'запросов = для ключа, Вэла из ...' вместо 'requests.push' внутри петля. –

+0

Спасибо за это, я раньше смотрел, как отложить функцию до тех пор, пока все мои запросы ajax не закончатся, и я использовал пример переполнения стека, который я нашел. Я не знал, что смогу это сделать. – josh

ответ

2

$.ajax является асинхронным (если не сказано иначе, но вы не хотите). Это означает, что цикл завершится до того, как будет выполнен вызов ajax. И когда этот вызов ajax окончательно заканчивается, «ключ» будет последним значением массива. (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