2010-08-02 8 views
2

J'essaie d'utiliser l'API de langage AJAX de Google pour traduire chaque valeur dans un tableau.Traduction par lots avec Google 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; 
    } 
}) 
} 

Cela se traduit correctement l'ensemble du réseau, mais dans la fonction appelée par le succès google.language.translate, n est toujours égal mycaptions.length. Cela entraîne mycaptions [n] renvoyant comme indéfini (par exemple, "a été traduit en Hola"). Cela m'a dérouté pendant des jours (pourquoi la valeur de n dans la fonction de rappel est toujours comme si vous étiez à la fin de la boucle ???), et je suppose que la réponse réside dans un peu de programmation que je viens de don ne comprends pas.

Répondre

1

Cela a à voir avec le fonctionnement des fermetures en JavaScript; lorsque JavaScript crée une fermeture, toutes les variables qui sont utilisées sont référencées plutôt que copiées. Ainsi, lorsque vous construisez la fonction anonyme, elle stocke une référence à n plutôt que de copier la valeur de n. Par conséquent, lorsqu'il est appelé, il s'exécute avec la valeur actuelle n (qui est la valeur qui lui est affectée à la fin de la boucle). La solution de contournement consiste à créer une fonction qui prend un paramètre n et renvoie une fermeture:

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

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