的NodeJS;在一系列依赖函数中进入Nth

时间:2015-03-09 23:48:37

标签: node.js asynchronous series

假设您有一系列需要在初始化期间按顺序执行的函数,但根据具体情况,您可以从其中任何一个开始。如果不是因为节点的异步性质,那么使用简单的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();
    }

我觉得使用异步可能是一个很好的方法,但我没有看到任何优雅。

想法?

1 个答案:

答案 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将函数作为变量处理的能力允许你做一些聪明的事情。