javascript 翻译工具回调
javascript callbacks for translation tool
我正在尝试使用 node.js 构建翻译引擎。我有 Python/R 背景,所以我不了解这些所谓的回调。 . .
输入的是一个句子:
var sentence = "I want to translate this"
当我点击 "Translate" 按钮时,它应该会触发翻译。
现在这是数据库查询,我在 /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"
如何让它按顺序返回?我知道有一些异步和回调的事情正在发生,但我相信编写节点代码的人很聪明,而且肯定有一种方法可以很容易地解决这个问题。
谢谢
让它们按顺序返回的唯一方法是链接调用,但这样一来就失去了异步调用的意义。
同时发送单词的索引,这样您就可以按正确的顺序将结果放在一起:
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);
}
});
}
您需要考虑到这样一个事实,即您的查询函数可能需要与 return 不同的时间,具体取决于您传递给它的字符串参数。现在,在您的示例代码中,如果在查询 "I" 之前查询 "want" returns,那么您的翻译将按照与查询 return 相同的顺序输出](即翻译"want",翻译"I")。
回调可以帮助您解决这个问题,因为它们是一个函数,只会在您的查询函数 returns 时被调用。然后由您来定义您的程序应该如何处理结果。例如,您的程序可以按照与原始数组相同的顺序输出结果。这可以使用 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)
,看你要报什么。
一旦您的查询函数接受了回调,您就可以知道它何时 return 一个值,并且您可以使用 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);
}
这个函数的作用是:
- 运行 并行查询单词数组中的所有项目
- 等待所有查询函数的所有回调到return
- 然后调用
async.map
自己的回调(这里是第三个参数:
function (err, translations) {console.log(translations);}
)
我正在尝试使用 node.js 构建翻译引擎。我有 Python/R 背景,所以我不了解这些所谓的回调。 . .
输入的是一个句子:
var sentence = "I want to translate this"
当我点击 "Translate" 按钮时,它应该会触发翻译。
现在这是数据库查询,我在 /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"
如何让它按顺序返回?我知道有一些异步和回调的事情正在发生,但我相信编写节点代码的人很聪明,而且肯定有一种方法可以很容易地解决这个问题。 谢谢
让它们按顺序返回的唯一方法是链接调用,但这样一来就失去了异步调用的意义。
同时发送单词的索引,这样您就可以按正确的顺序将结果放在一起:
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);
}
});
}
您需要考虑到这样一个事实,即您的查询函数可能需要与 return 不同的时间,具体取决于您传递给它的字符串参数。现在,在您的示例代码中,如果在查询 "I" 之前查询 "want" returns,那么您的翻译将按照与查询 return 相同的顺序输出](即翻译"want",翻译"I")。
回调可以帮助您解决这个问题,因为它们是一个函数,只会在您的查询函数 returns 时被调用。然后由您来定义您的程序应该如何处理结果。例如,您的程序可以按照与原始数组相同的顺序输出结果。这可以使用 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)
,看你要报什么。
一旦您的查询函数接受了回调,您就可以知道它何时 return 一个值,并且您可以使用 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);
}
这个函数的作用是:
- 运行 并行查询单词数组中的所有项目
- 等待所有查询函数的所有回调到return
- 然后调用
async.map
自己的回调(这里是第三个参数:function (err, translations) {console.log(translations);}
)