所以...我知道这不是正确的方式...但我有一个我自己进入的盒子,如果我能找到一种方法,我看起来最容易导航“get”请求在node.js
中同步运行是的,我尝试了节点同步(看起来应该可以正常工作)
情景就是这个
我知道如何调用google translate(可以很容易地对整个字符串进行调用),但无法理解如何获得异步回调的排序与参数化字符串上的递归一致我拥有的数据集是必要的。
如果我可以将对Web服务的调用表现为同步,那么这将很简单。 e.g。
read string (while not EOF)
recurse (get the next token)
translate the fragment (which is done with request.get()
add translated fragment to the current string
assemble translated string
write to file
节点同步示例有效,但我无法使用request.get()
。
有什么建议吗?
摘录
// this function gets passed in a string and recursively pulls out and
// attempts to translate tokens. It needs to do this as the data source
// contains "key" = "fragment" + $(paramter1) + fragment + $(parameter2) etc
function getTokenSegment(sourceString){
s = sourceString; //lazy
// if the string contains a parameter
if (s.indexOf(leadingDelimiter) != -1) {
// extract the tokens...omitted the error checking (which all works)
translatedToken = syncTranslate(token); // <--- THIS IS WHAT I WANT...
parameter = s.substring(token.length+1, s.indexOf(trailingDelimiter)+1);
remainder = s.substring(token.length + parameter.length+1, s.length);
translatedString = translatedString + translatedToken + parameter
// recursive call to get the rest of the string
+ getTokenSegment(remainder);
}
else {
// the remainder of the string can be translated intact
translatedToken = syncTranslate(s);
translatedString = translatedString + translatedToken;
}
return (translatedString);
}
function syncTranslate(stringToTranslate) {
var sync = require('sync');
sync(function(){
var result = translate.sync(null, {key: key, q: stringToTranslate, target: language});
})
return result;
}
// translate module is from Mike Holly -- https://github.com/mikejholly/node-google-translate
// and worked perfectly when I used it on non-parameterized strings. only edit is the NULL as the
// first parameter in the callback, copied from the node-sync simple example]
var request = require('request')
, _ = require('underscore')
, querystring = require('querystring')
, util = require('util')
module.exports = function(opts, callback) {
// parse & default the arguments
opts = _.defaults(opts, {
source: 'en',
target: 'fr',
key: 'secret',
sourceText: 'text'
});
var url = 'https://www.googleapis.com/language/translate/v2?' + querystring.stringify(opts);
request.get(url, function(err, response, body){
if (err) throw err;
// parse the returned JSON
var json = JSON.parse(body);
if (json.error) {
throw json.error.message;
}
var strings = util.isArray(opts.sourceText) ? opts.sourceText : [opts.sourceText];
var result = {};
var translatedString = '';
strings.forEach(function(original, i){
result[original] = json.data.translations[i].translatedText;
translatedString = result[original];
});
callback(null, translatedString);
});
};
答案 0 :(得分:0)
我猜这里,因为你的问题不够明确。我很感激你的困难,因为很难谈论软件。我想您忘了将代码包装在同步块中:
// Run in a fiber
Sync(function(){
// your code
})
来源:https://github.com/0ctave/node-sync#examples
我给你一个提示。首先尝试最简单的任务。尝试翻译只有一个单词,然后使用翻译后的单词。在request.get()
内使用Sync
执行此操作。当这种方法有效时,您会更加信任该软件,并且更有信心继续处理更复杂的事情。
答案 1 :(得分:0)
在node.js中编写同步代码的一个非常流行的模块是async。对于您的问题,我会尝试waterfall
函数:
async.waterfall([
// your first function
function(callback){
callback(null, 'one', 'two');
},
// your second function
function(arg1, arg2, callback){
callback(null, 'three');
},
// your third function
function(arg1, callback){
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});