Пакетный перевод с Google Language API - PullRequest
2 голосов
/ 03 августа 2010

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

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, n всегда равно mycaptions.length. Это приводит к тому, что mycaptions [n] возвращается как неопределенное (например, "было переведено на Hola"). Это сбивало меня с толку в течение нескольких дней (почему значение n внутри функции обратного вызова всегда, как будто вы находитесь в конце цикла ???), и я предполагаю, что ответ заключается в очевидном программировании, которое я просто надеваю не понимаю.

1 Ответ

1 голос
/ 03 августа 2010

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

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

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