1

我使用某个 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);
}

即它不返回值,而是使用该值调用回调函数。

我的问题是:我如何使用正确的拼写功能,作为我发送给 TextCategorizer 的预处理器数组中的预处理器之一?

4

3 回答 3

2

如果您想按特定顺序放置一堆任务,您可以使用异步框架(npm install async)。有一个用于同步异步函数的特定功能,称为“系列”。

听起来您在使用同步和异步功能时遇到了问题。在这种情况下,我认为您应该像这样将所有同步函数包装在异步函数中

function asyncFunc(args, callback){
    process.nextTick(function() {
        callback(syncFunc(args));
    });
}

async然后你应该使用模块将它们链接在一起。

看起来这可能会使异步函数同步。

在 github 上等待

于 2013-08-22T13:59:00.673 回答
1

如果我上面关于我对您的问题的理解的评论是正确的,我不相信有一种方法可以按照您想要的方式取消异步调用,而无需修改 TextCategorizer 的源,您表示不会是最优的。

我唯一的另一个想法是在调用 train() 和分类之前通过现有的预处理器列表运行您的文档,这将允许您遵循 JoshC 的建议。

于 2013-08-22T21:19:05.470 回答
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();

期货https://github.com/laverdet/node-fibers#futures

于 2013-08-28T05:42:51.643 回答