我使用某个Node.js类进行文本分类。最简单的形式如下:
function TextCategorizer(preprocessors) {
...
}
“预处理器”是以下形式的函数数组:
function(text) {
return "<modified text>"
}
例如,它们可用于去除标点,转换为小写等。
我可以像这样使用TextCategorizer:
var cat = newTextCategorizer(preprocessors);
cat.train(text1,class1);
cat.train(text2,class2);
...
console.log(cat.classify(text3,class3);
为每个训练文本和分类文本调用预处理器。
现在,我需要添加一个新的预处理器函数 - 拼写纠正器。我发现最好的拼写错误地发现(通过网络服务)异步工作,所以,函数看起来像这样:
correctSpelling(text, callback) {
...
callback(corrected_version_of_text);
}
即。它不返回值,而是使用值调用回调函数。
我的问题是:我如何使用correctSpelling函数,作为我发送给TextCategorizer的预处理器数组中的预处理器之一?
答案 0 :(得分:2)
如果你想按一定顺序放置一堆任务,你可以使用async框架(npm install async)。有一个特定的功能可以同步称为“系列”的异步函数。
听起来您使用同步和异步功能时遇到问题。在这种情况下,我认为您应该将所有同步函数包装在异步函数中,如此
function asyncFunc(args, callback){
process.nextTick(function() {
callback(syncFunc(args));
});
}
然后你应该使用async
模块将它们链接在一起。
<击> 撞击>
看起来这可能会使异步函数同步。
答案 1 :(得分:1)
如果我上面关于我对您的问题的理解是正确的,我不相信有一种方法可以按照您想要的方式取消同步异步调用,而无需修改TextCategorizer的来源,而您# 39; d表示不是最佳的。
我唯一的另一个想法是在调用train()和classify()之前通过现有的预处理器列表运行你的文档,这样你就可以遵循JoshC的建议。
答案 2 :(得分:1)
如果你真的想这样做,你可以试试Fibers。
var Future = require('fibers/future'), wait = Future.wait;
var fs = require('fs');
// This wraps existing functions assuming the last argument of the passed
// function is a callback. The new functions created immediately return a
// future and the future will resolve when the callback is called (which
// happens behind the scenes).
var readdir = Future.wrap(fs.readdir);
var stat = Future.wrap(fs.stat);
Fiber(function() {
// Get a list of files in the directory
var fileNames = readdir('.').wait();
console.log('Found '+ fileNames.length+ ' files');
// Stat each file
var stats = [];
for (var ii = 0; ii < fileNames.length; ++ii) {
stats.push(stat(fileNames[ii]));
}
wait(stats);
// Print file size
for (var ii = 0; ii < fileNames.length; ++ii) {
console.log(fileNames[ii]+ ': '+ stats[ii].get().size);
}
}).run();
参见 FUTURES (https://github.com/laverdet/node-fibers#futures)