2010-08-02 3 views
2

Я пытаюсь использовать API языка AJAX Google для перевода каждого значения в массив.Пакетный перевод с помощью API Google Language

for(var n=0; n < mytext.length; n++) { 
google.language.translate(mytext[n], originalLanguage, newLanguage, function(result){ 
    if(!result.error){ 
    document.getElementById("caption") += mytext[n]+" has been translated to "+result.translation; 
    } 
}) 
} 

Это верно переводит весь массив, но в функции успеха наречено google.language.translate, п всегда равен mycaptions.length. Это приводит к тому, что mycaptions [n] возвращаются как неопределенные (например, «был переведен в Hola»). Это меня поразило в течение нескольких дней (почему значение n внутри функции обратного вызова всегда так, как если бы вы были в конце цикла ???), и я предполагаю, что ответ лежит в очевидной части программирования, которую я просто надел Не получишь.

ответ

1

Это связано с тем, как закрытие работает в JavaScript; когда JavaScript создает закрытие, любые используемые переменные ссылаются, а не копируются, поэтому при создании анонимной функции он сохраняет ссылку на n, а не копирует значение n. Следовательно, когда он фактически вызван, он запускается с текущим значением n (которое является значением, которое присваивается ему в конце цикла). Обходным путем является создание функции, которая принимает параметр n и возвращает замыкание:

function createSuccessFunction(n) { 
    return function() { 
      // behavior on success 
    }; 
} 

// use createSuccessFunction(n) where you need a callback