假设您有一系列需要在初始化期间按顺序执行的函数,但根据具体情况,您可以从其中任何一个开始。如果不是因为节点的异步性质,那么使用简单的switch语句就可以轻松实现这一点,其中每个case都会进入下一个;但是,每个函数都执行I / O(数据库命中)。
阻止语言/框架如下所示:
switch ( entry_point )
{
case 0:
function_zero( blah );
case 1:
function_one( blah );
case 2:
function_two( blah );
[.... up to case N ....]
default:
wrap_up();
}
我觉得使用异步可能是一个很好的方法,但我没有看到任何优雅。
想法?
答案 0 :(得分:0)
如果所有功能都按顺序排列,您可以将所有功能添加到阵列中:
var functions = [function_zero, function_one, function_two, wrap_up];
然后使用例如async
模块执行它们,如下所示:
async.series(functions);
将它们添加到数组中的好处是你可以将数组切片到中间开始,如下所示:
async.series(functions.slice(entry_point));
一个完整的例子:
var async = require('async');
function function_zero(next) {
console.log('zero');
setTimeout(function() {
console.log('zero done');
next(null);
}, 200);
}
function function_one(next) {
console.log('one');
setTimeout(function() {
console.log('one done');
next(null);
}, 200);
}
function function_two(next) {
console.log('two');
setTimeout(function() {
console.log('two done');
next(null);
}, 200);
}
function wrap_up(next) {
console.log('wrap up');
next();
}
var functions = [function_zero, function_one, function_two, wrap_up];
async.series(functions.slice(1));
输出:
one
one done
two
two done
wrap up
当然这个解决方案对于这种情况非常具体,但是通常Javascript将函数作为变量处理的能力允许你做一些聪明的事情。