NodeJs的异步调用机制虽然神奇并好用,但也并非不会引起任何副作用。传统的异步调用方式看起来像是下面这样:
asynFunA(function(errA,resA){ if(!errA) { asynFunB(function(errB,resB){ if(!errB) { asynFunC(function(errC,resC){ if(!errC) { asynFunD(function(errD,resD){ ...... }); } }); } }); } });
假设实际代码中同时调用多达十几个甚至更多的异步函数,你会发现一层又一层叠加的代码被顶到了屏幕之外。这还没有加入异常处理的代码呢。否则实际的代码将会变得零散而臃肿。
为了避免陷入上述异步调用的深度嵌套所带来的诸多不便,一种行之有效的解决办法是使用EventProxy:
$ npm install -g EventProxy
有了EventProxy,于是上述代码变成:
var EventProxy=require("eventproxy"); var ep = new EventProxy(); ep.all('eventA','eventB','eventC','eventD',...,function(resA,resB,resC,resD,...){ //do something with resA,resB,resC,resD,... }); asynFunA(function(errA,resA){ if(!errA) { ep.emit('eventA',resA); } }); asynFunB(function(errB,resB){ if(!errB) { ep.emit('eventB',resB); } }); asynFunC(function(errC,resC){ if(!errC) { ep.emit('eventC',resC); } }); asynFunD(function(errD,resD){ if(!errD) { ep.emit('eventD',resD); } }); ......
ep.all('eventA','eventB','eventC','eventD',...,function(resA,resB,resC,resD,...,){})将在参数代表的所有事件触发之后调用最后一个参数表示的回调函数。回调函数内的参数与各个事件触发时所返回的结果一一对应。感觉不错吧,赶紧试试。