2011-10-11 102 views
0

我正在嘗試編寫一個腳本,可以讓我快速檢查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翻譯後才執行。

回答

0

這確實是一個同步問題。當您撥打第一個google.language.translate時,您會傳遞一個回叫,但該回叫不會立即執行 - 只有在translate從服務器獲取翻譯後纔會執行。與此同時,代碼繼續運行,並執行第二個google.language.translate,傳入german[i],這在當時可能未定義。

要序列化這些a-sync呼叫的執行,可以在document.write("2")之後的第一個呼叫的回調內放置第二個呼叫到google.language.translate。這將確保german[i]在使用之前被設置。

+0

我做了這個修改,經過一番推動之後,它修復了這個問題。謝謝! –