JavaScriptcallback的翻译工具

我正在尝试使用node.js构build一个翻译引擎。 我有一个Python / R的背景,所以我没有得到这些所谓的callback的挂钩。 。 。

input是一个句子:

var sentence = "I want to translate this" 

当我点击“翻译”button时,它应该触发翻译。

现在这是数据库查询,我在/ translate处调用一个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" 

我怎样才能使它回来? 我知道有一些asynchronous和callback的事情正在进行,但是我确实相信那些编码节点的人很聪明,而且肯定有办法很容易地解决这个问题。 谢谢

让它们按顺序返回的唯一方法是链接这些调用,但是这样做首先就消除了asynchronous调用的重要性。

沿着这个词的索引也发送,这样你可以把结果放在一起在正确的顺序:

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

你需要考虑到你的查询函数可能需要不同的时间才能返回,这取决于你传递的string参数。 现在,在您的示例代码中,如果“want”查询在查询“I”之前返回,那么您的翻译将以与查询返回相同的顺序输出(即翻译“want”,翻译“I “)。

callback可以帮助你解决这个问题,因为它们是一个函数,只有当你的查询函数返回时才会被调用。 然后,由您决定您的程序应该如何处理结果。 例如,您的程序可以按照原始数组的顺序输出结果。这可以使用Guffabuild议的索引或使用稍后讨论的asynchronous库来实现。

所以,你可以尝试的一件事是传递查询callback像这样:

 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的规范方法是给它两个参数,所以它看起来像: callback(err, result) 。 如果没有错误,则可以调用callback(null, result) ,当发生错误时,可以调用callback(err)callback (err, result) ,具体取决于您要报告的内容。

一旦你的查询函数进行callback,你就可以知道它何时返回一个值,并且可以使用async.map函数(来自asynchronous库 ),如下所示:

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

这个function的作用是:

  • 并行查询单词数组中的所有项目
  • 等待所有查询函数的所有callback函数返回
  • 然后调用async.map自己的callback(这里是第三个参数: function (err, translations) {console.log(translations);}