这是同步问题吗?使用谷歌翻译链翻译单词。

时间:2011-10-11 20:26:30

标签: javascript asynchronous concurrency google-translate

我正在尝试编写一个脚本,这样我可以快速查看Google翻译多次翻译时单词的变化情况。不幸的是,我对Javascript不是很有经验,我无法确定我遇到的问题的根源:

function 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);

正如您所看到的,第二次调用google.language.translate将第一次调用的结果作为参数。我希望在运行时可以在文档中看到类似的内容:

1Hallo23Hello45Hallo23Hello45Hallo23Hello45 ...

相反,我得到了13Hallo2并且崩溃了。因为它打印1和3(即它在执行所有第一次转换调用之前执行doc.write(“3”))我怀疑某种异步行为正在进行。我使用的代码按我写的顺序执行!救命!理想情况下,我想知道如何在第一次调用google translate之后执行剩下的循环。

1 个答案:

答案 0 :(得分:0)

这确实是同步问题。当你调用第一个google.language.translate时,你会传入一个回调函数,但是只有在translate从服务器获得翻译后才会立即执行该回调。与此同时,代码继续运行,并执行第二个google.language.translate,传入german[i],这可能在此时未定义。

要序列化这些同步调用的执行,您可以在google.language.translate之后的第一个回调中将document.write("2")的第二个调用放入其中。这将确保在使用前设置german[i]