2009-07-16 1 views
0

Ich entwickle eine einfache Web-App, die das Google-Übersetzungs-API verwendet, um einen Text in verschiedene Sprachen zu übersetzen und dann zurück zum ersten.Javascript-Synchronisationsmethoden

Das Problem ist, dass beim Aufruf von google.language.translate (...) eine Callback-Funktion angegeben wird, die eine Textarea auf meiner Seite aktualisiert. Hier:

while (i < translationNumber) { 
    google.language.translate(testua, languages[i] , languages[i+1], 
    function(result) { 
    if (result.translation) { 
     text = result.translation; 
     f.textarea1.value = text; 
    } 
    }); 

    alert('You must not close this until translation is done'); 
    i++; 
} 

Wie Sie sehen, wird eine Warnung erforderlich, um manuell für die Übersetzung warten zu beenden, so ist es richtig in der Reihenfolge meiner Sprachen Array übersetzt, sonst mehrere Anrufe übersetzen anhängig ist und die Auftragsumbrüche . Es wäre großartig, wenn ich eine Art Semaphor wie in Java oder C verwenden könnte, aber ich bin ziemlich neu in Javascript und ich weiß nicht, wie das gemacht werden könnte.

+0

Haben Sie den Textbereich wollen wird aktualisiert nach der Array-Reihenfolge? –

+0

Ich möchte diese Warnung entfernen und die Google Translate Funktionsaufruf blockierend oder synchron machen, um die Übersetzung secuential zu tun, sonst führt es die Schleife aus und ich empfange dann die Übersetzungen, aber nicht sequentielle, nur Übersetzungen des Originaltextes in verschiedene Sprachen – Hiperi0n

Antwort

8

Sie könnten stattdessen diese eine Funktion machen, die sich

function translate(i) { 
    google.language.translate(testua, languages[i], languages[i+1], function(result) { 
    if (result.translation) { 
     text = result.translation; 
     f.textarea1.value = text; 
     if (i < translationNumber) { translate(i++); } 
    } 
    } 
} 

Auf diese Weise wird die nächste Übersetzung nach Abschluss rufen wird erst nach Rückruf von Übersetzung instansiated werden.

edit: Das einzige, was Sie hinzufügen müssen eine Prüfung ist, zu sehen, ob i den gewünschten Wert erreicht hat, so dass es nicht immer geht auf (:

+0

In die Unendlichkeit und darüber hinaus – Blixt

+0

Danke, ich denke, das wird funktionieren :-) – Hiperi0n