节点;落入一系列相关函数中的第 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 将函数作为变量处理的能力可以让您做一些聪明的事情。
假设您有一系列函数需要在初始化期间按顺序执行,但根据具体情况,您可能会从其中的任何一个开始。如果不是因为节点的异步特性,这将很容易通过一个简单的 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 将函数作为变量处理的能力可以让您做一些聪明的事情。