将异步函数转换为同步函数

时间:2013-08-22 13:52:22

标签: node.js asynchronous

我使用某个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的预处理器数组中的预处理器之一?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

<击>

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

waitfor on github

答案 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