开发者

Is this a synchronization issue? Using Google translate to chain-translate words.

I'm trying to write a script that will allow me to quickly examine how a word changes when translated multiple times by Google translate. Unfortunately, I'm not very experienced with Javascript and I can't pin down the source of the problem I'm having:

func开发者_如何学编程tion initialize() {
    var word = "Hello";
    var english = [word];
    var german = [];
    document.write("1");

    var i = 0;
    for  (i=0; i<10; i++) {

        google.language.translate(english[i], 'en', 'de', function(result) {
            if (!result.error) {
                german.push(result.translation);
                document.write(result.translation); 
            }
            else {
                document.write(result.error.message);
            }
            document.write("2");
        });

        document.write("3");

        google.language.translate(german[i], 'de', 'en', function(result) {
            if (!result.error) {
                english.push( result.translation );
                document.write ( result.translation );
            }
            else {
                document.write(result.error.message);
            }
            document.write("4");
        });

        document.write("5");

    }
}

google.setOnLoadCallback(initialize);

As you can see, the second call to google.language.translate takes as an argument the result of the first call. I expect to see something like this in the document when this is run:

1Hallo23Hello45Hallo23Hello45Hallo23Hello45 ...

Instead I get 13Hallo2 and a crash. Because it prints 1and 3 (ie it executes the doc.write("3") before it executes all of the first call to translate) I suspect some sort of asynchronous behavior is going on. I'm used code that executes in the order I wrote it! Help! Ideally I'd like to know how I can get the rest of the loop to only execute after the first call to google translate has returned.


That's indeed a synchronization issue. When you call the first google.language.translate, you pass in a callback, but that callback isn't executed immediately - only after translate gets a translation from the server. In the mean time, the code continues to run, and executes the second google.language.translate, passing in german[i], which is probably undefined at that point.

To serialize the execution of those a-sync calls, you can place the second call to google.language.translate inside the callback of the first one, after the document.write("2"). This will ensure german[i] is set before used.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜