Пакетный перевод с Google Language API
Я пытаюсь использовать 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 ответ
Это связано с тем, как замыкания работают в JavaScript; когда JavaScript создает замыкание, любые переменные, которые используются, ссылаются, а не копируются, поэтому, когда вы создаете анонимную функцию, она сохраняет ссылку на n
вместо того, чтобы копировать значение n
, Следовательно, когда он действительно вызывается, он работает с текущим значением n
(это значение, которое присваивается ему в конце цикла). Обходной путь должен создать функцию, которая принимает параметр n
и возвращает закрытие:
function createSuccessFunction(n) {
return function() {
// behavior on success
};
}
// use createSuccessFunction(n) where you need a callback