Nodejs将昂贵的同步任务转换为异步系列

时间:2012-12-20 21:40:09

标签: node.js asynchronous

在nodejs中,我有一个昂贵的功能,例如:

function expensiveCode(){
  a.doExensiveOperation(1);
  b.doAnotherExensiveOperation(2);
  c.doADiffererentExensiveOperation(3);
  d.doExensiveOperation(4);
}

这样每个子函数调用都有不同的参数,因此无法在循环中完成。我想限制这个昂贵的函数调用,以便每个子调用都在nextTick上完成,例如:

function expensiveCode(){
    process.nextTick(function(){
        a.doExensiveOperation(1);
        process.nextTick(function(){
            b.doAnotherExensiveOperation(2);
            process.nextTick(function(){
                c.doADiffererentExensiveOperation(3);
                process.nextTick(function(){
                  d.doExensiveOperation(4);                 
                });
            });
        });
    });
}

这显然是丑陋的,如果有20行不同的操作会太可怕甚至不考虑。

我已经回顾了许多像“async.js”这样的库,但它们似乎都期望被调用的函数是异步的 - 在完成时有一个回调函数。我需要一个简单的方法来做到这一点,而不是将我的所有代码转换为'完成后回调'方法,这看起来有点矫枉过正。

1 个答案:

答案 0 :(得分:2)

很抱歉破解了您的气泡,但async.waterfallasync.seriesasync.apply相结合是您想要的,是的,您需要将这些操作设为异步。我发现很难相信你已经发现了20种不同的计算密集型操作,其中没有任何IO可以执行任何操作。查看bcrypt库,了解如何提供CPU密集型调用的同步和异步版本的示例。在完成时将代码转换为回调并不是过度的,它是节点。这是节点中的规则。您的函数不执行IO并快速完成,或者使其与回调异步。选项结束。