节点;落入一系列相关函数中的第 N 个

nodejs; drop into Nth in a series of dependent functions

假设您有一系列函数需要在初始化期间按顺序执行,但根据具体情况,您可能会从其中的任何一个开始。如果不是因为节点的异步特性,这将很容易通过一个简单的 switch 语句来实现,每个案例都会落到下一个;但是,每个函数确实执行 I/O(数据库命中)。

阻止 language/framework 将如下所示:

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();
    }

我觉得可能有一种使用异步执行此操作的好方法,但我没有看到任何优雅的东西。

想法?

如果所有函数都按顺序排列,您可以将所有函数添加到一个数组中:

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 将函数作为变量处理的能力可以让您做一些聪明的事情。