2015-02-09 62 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