javascript回调翻译工具

时间:2015-02-09 19:38:34

标签: javascript node.js mongodb

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

输入是一个句子:

 var sentence = "I want to translate this"

当我点击"翻译"按钮,它应该触发翻译。

现在这是数据库查询,我在/ 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"

如何让它按顺序返回?我知道有一些异步和回调的东西正在发生,但我相信编码节点的人很聪明,而且肯定有办法很容易地解决这个问题。 感谢

2 个答案:

答案 0 :(得分:3)

您需要考虑以下事实:您的查询函数可能需要不同的时间才能返回,具体取决于您传递的字符串参数。现在,在您的示例代码中,如果查询“想要”在查询“I”之前返回,那么您的翻译将按照查询返回的相同顺序输出(即翻译“想要”,翻译“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);
}

这个功能的作用是:

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

答案 1 :(得分: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);
    }
  });
}