首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于翻译工具的javascript回调

用于翻译工具的javascript回调
EN

Stack Overflow用户
提问于 2015-02-09 19:38:34
回答 2查看 142关注 0票数 1

我正在尝试使用node.js构建一个翻译引擎。我有Python/R背景,所以我不会掌握这些所谓回调的诀窍。。。

输入是一个句子:

代码语言:javascript
复制
 var sentence = "I want to translate this"

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

现在是数据库查询,我在/translate调用一个/translate后端

代码语言:javascript
复制
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);
       }
   });
}

然后是这样的:

代码语言:javascript
复制
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]);
}

但是,控制台日志中的输出如下所示:

代码语言:javascript
复制
output[0]: "translate", "want", "to", "I"

我怎样才能让它井然有序?我知道有一些异步和回调的东西正在进行,但我确实相信编码节点的人是聪明的,而且肯定有一个解决这个问题的方法。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 19:54:18

使它们按顺序返回的唯一方法是链接调用,但是首先您将去掉异步调用的意义。

同时为单词发送索引,这样您就可以按正确的顺序将结果放在一起:

代码语言:javascript
复制
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);
    }
  });
}
票数 1
EN

Stack Overflow用户

发布于 2015-02-09 21:30:40

您需要考虑以下事实:根据传递的字符串参数,查询函数可能需要不同的时间返回。现在,在您的示例代码中,如果对“希望”的查询在查询"I“之前返回,那么您的翻译将按照查询返回的相同顺序输出(即”希望“的翻译,”i“的翻译)。

回调可以帮助您解决这个问题,因为它们是一个只有在查询函数返回时才会调用的函数。然后,由您来定义您的程序应该对结果做什么。例如,您的程序可以按照与原始数组相同的顺序输出结果。这可以使用Guffa建议的索引来实现,或者使用我们稍后讨论的异步库

因此,您可以尝试的一件事是传递这样的查询回调:

代码语言:javascript
复制
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函数(来自异步库),如下所示:

代码语言:javascript
复制
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);
}

这一职能的作用是:

  • 对words数组中的所有项进行并行查询。
  • 等待所有查询函数的所有回调返回
  • 然后调用async.map自己的回调(这里是第三个参数:function (err, translations) {console.log(translations);})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28417860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档