2015-02-09 40 views
1

我正嘗試使用node.js構建翻譯引擎。我有一個Python/R背景,所以我沒有得到這些所謂的回調。 。 。翻譯工具的JavaScript回調

輸入是一個句子:

var sentence = "I want to translate this" 

當我點擊「翻譯」按鈕,它應該觸發轉換。

現在,這是數據庫查詢,我呼籲在Node.js的後端/翻譯

function query(string){ 
    var query = 
    db.call.get(query, function(result){ 
     if(result.length>0){ 
      console.log(result[0].translation); 
     } else { 
      // not found in database 
      console.log(string); 
     } 
    }); 
} 

現在,它是這樣的:

var wordList = sentence.split(" "); 
for(i=0; i<wordList.length; i++){ 
    // i call the database to return me the translation for each word 
    query(wordList[i]); 
} 

但隨後,在控制檯輸出日誌就這樣產生了:

output[0]: "translate", "want", "to", "I" 

我怎樣才能使它回來的訂單?我知道有一些異步和回調的事情正在進行,但我確實認爲編碼節點的人很聰明,並且確實有辦法很容易地解決這個問題。 謝謝

回答

1

讓它們按順序回來的唯一方法就是鏈接這些調用,但是這樣可以消除異步調用的重要性。

沿着這個詞也該指數發送,這樣你可以把結果放在一起以正確的順序:

var wordList = sentence.split(" "); 
var resultList = []; 
var resultCount = 0; 
for (i = 0; i < wordList.length; i++){ 
    // i call the database to return me the translation for each word 
    query(wordList[i], i); 
} 

function query(string, index){ 
    var query = db.call.get(query, function(result){ 
    if (result.length > 0){ 
     resultList[index] = result[0].translation; 
    } else { 
     // not found in database 
     resultList[index] = string; 
    } 
    resultCount++; 
    if (resultCount == wordList.length) { 
     console.log(resultList); 
    } 
    }); 
} 
+0

你是男人!非常感謝,我因此而生氣! – 2015-02-09 20:36:44

3

你需要考慮到一個事實,即你的查詢功能可能會採取不同的時間取決於你傳遞它的字符串參數。現在,在您的示例代碼中,如果「want」查詢在查詢「I」之前返回,那麼您的翻譯將以查詢返回的相同順序輸出(即翻譯「want」,翻譯「I 「)。

回調可以幫助你解決這個問題,因爲它們是一個只在你的查詢函數返回時才被調用的函數。然後,由您決定您的程序應該如何處理結果。例如,您的程序可以按照原始數組的相同順序輸出結果。這可以使用Guffa建議的索引或使用稍後將討論的async library來實現。

所以,有一兩件事你可以嘗試是查詢通過這樣的回調:

function query(string, callback){ 
    db.call.get(query, function(result){ 
     if(result.length>0){ 
      callback(null, result[0].translation); 
     } else { 
      // not found in database 
      callback(null, string); 
     } 
    }); 
} 

在Node.js的使用回調的規範方式,給它兩個參數,所以它看起來像: callback(err, result)。如果沒有錯誤,您可以撥打callback(null, result),如果有錯誤,則可以撥打callback(err)callback (err, result),具體取決於您要報告的內容。

一旦你的查詢功能需要一個回調,你能知道什麼時候它沒有返回一個值,你可以使用async.map功能(從async library),像這樣:

var async = require('async'); 
var sentence = "I want to translate this"; 
var words = sentence.split(' '); 

async.map(words, query, function (err, translations) { 
    console.log(translations); 
} 

這是什麼功能確實,是:

  • 在並行查詢的話陣列中的所有項目
  • 等待所有的回調運行所有的查詢功能返回
  • 然後調用async.map自己的回調(這裏的第三個參數: function (err, translations) {console.log(translations);}
+0

非常感謝瑪麗徹底的解釋!我目前正在使用一個名爲deployd的工具,而我正在編寫的腳本是客戶端,如果我在客戶端執行require async,您認爲它仍然可以工作嗎?我認爲這是一個服務器端庫。糾正我,如果我錯了,我對此很新。 – 2015-02-10 21:53:31

+1

你應該可以使用它作爲客戶端庫,只需檢查使用[這裏](https://github.com/caolan/async#in-the-browser)。您需要將腳本'導入'腳本標籤中,然後您應該全部設置。 'async'庫有一些很棒的功能,所以我很肯定它會變得有用。 – Marie 2015-02-11 16:05:50