【问题标题】:Is this a synchronization issue? Using Google translate to chain-translate words.这是同步问题吗?使用谷歌翻译链接翻译单词。
【发布时间】:2011-10-11 20:26:30
【问题描述】:

我正在尝试编写一个脚本,让我能够快速检查一个单词在被 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(即它在执行所有第一次调用 translate 之前执行 doc.write("3"))我怀疑某种异步行为正在发生。我使用了按照我编写的顺序执行的代码!帮助!理想情况下,我想知道如何让循环的其余部分仅在第一次调用谷歌翻译返回后执行。

【问题讨论】:

    标签: javascript asynchronous concurrency google-translate


    【解决方案1】:

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

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

    【讨论】:

    • 我做了这个修改,在稍微摆弄一下 push 之后,它解决了这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多