我正在尝试编写一个脚本,这样我可以快速查看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之后执行剩下的循环。
答案 0 :(得分:0)
这确实是同步问题。当你调用第一个google.language.translate
时,你会传入一个回调函数,但是只有在translate
从服务器获得翻译后才会立即执行该回调。与此同时,代码继续运行,并执行第二个google.language.translate
,传入german[i]
,这可能在此时未定义。
要序列化这些同步调用的执行,您可以在google.language.translate
之后的第一个回调中将document.write("2")
的第二个调用放入其中。这将确保在使用前设置german[i]
。