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