1

у меня есть это в функции:Последнее значение асинхронной функции в цикле

for (i=0; i < toTranslateArray.length; i++) 
{ 
    (function(i) 
    { 
     getTranslation(toTranslateArray[i],function(callback_result) 
     { 
      trans += callback_result; 
     });   
    })(i); 
} 
// code using last value of trans 

мне нужно использовать последнее значение транс. Я видел много примеров, но я просто не могу заставить его работать. Еще ответы же с моей проблемой: link

+1

Является ли заказ, в котором вы сопоставляете результаты? – Bergi

+3

Когда вы используете 'for-in', невозможно достоверно узнать, когда вы находитесь в последнем значении, если только вы не посчитаете свойства заранее. Является ли 'toTranslateArray' фактическим массивом? Если это так, это становится проще, хотя вы все равно не должны использовать 'for-in', а скорее оператор' for'. –

+0

Что вы пытались заставить его работать? Пожалуйста, покажите нам свои конкретные попытки, иначе нам нужно будет обратиться к этому вопросу с той же проблемой. – Bergi

ответ

1

Это является довольно стандартным способом борьбы с асинхронными петлях (смотри также JavaScript closure inside loops – simple practical example):

var results = []; 
for (var count=0; count<toTranslateArray.length; count++) (function(i) { 
    getTranslation(toTranslateArray[count], function(res) { 
     results[i] = res; 
     if (! --count) { // when all results are settled (count is back to zero) 
      var trans = results.join(""); 
      // code using trans 
     } 
    });   
})(count); 

Заметим, что это будет выполняться только код, когда был по крайней мере один элемент в массиве.

+1

А, я был всего в нескольких секундах от публикации, но с '.forEach()'. +1 –

+0

@smotru: Спасибо, что нашел опечатку, отредактировал! – Bergi

+0

Вы только что спасли меня через 2 дня по этой проблеме. Я не мог понять закрытия :( – smotru