所以我在 Node.js 中开始了一个小项目来了解它。它是 Arch linux 软件包系统的简单缓存代理,因为节点提供了大部分繁重的工作。
这有两个“主要”阶段,服务器设置和服务。然后服务有两个主要阶段,响应设置和响应。
“主要”设置包括检查一些文件,从文件中加载一些配置。从网址加载一些 json。然后使用此信息启动 http 服务器和代理实例。
- 设置记录器/选项 - 读取配置 - 读取镜像 - 读取 webmirror
- 开始服务
服务包括检查请求以查看文件是否存在,如果需要创建目录,然后提供响应。
- 检查请求 - 检查目录 - 检查文件
- 代理请求或服务文件
我一直将它们称为同步点,但搜索不会产生很多结果。在流程可以完成下一步之前必须完成一组异步任务的点。Perl 的 AnyEvent 有条件变量,我想这是我想要做的,没有阻塞。
首先,我发现我在“作弊”并使用提供的任何功能的同步版本,但不得不停止网络请求,所以我开始重组。大多数搜索立即导致使用异步或步骤来控制流程。首先,我尝试了很多系列/并行设置,但是如果函数下面有任何异步调用会立即“完成”并且系列将完成,则会遇到问题。
经过多次哀号和咬牙切齿后,我最终得到了一个使用async .until 的“服务员”函数,该函数测试了在启动下一个函数之前完成的所有任务设置的某些程序状态。
// wait for "test" to be true, execute "run",
// bail after "count" tries, waiting "sleep" ms between tries;
function waiter( test, run, count, sleep, message ) {
var i=0;
async.until(
function () {
if ( i > count ) { return true; }
logger.debug('waiting for',message, test() );
return test();
},
function (callback) {
i++;
setTimeout(callback, sleep );
},
function (err) {
if ( i > count ) {
logger.error('timeout for', message, count*sleep );
return;
}
run()
}
);
}
我觉得它相当大而且丑陋,需要一个模块来实现我认为是标准的东西,所以我想知道什么是更好的方法。我还在以非异步的方式思考吗?我忽略了 Node 中有什么简单的东西吗?有这样做的标准方法吗?
我想通过这种设置,如果程序变得复杂,将会有很多嵌套函数来描述程序的流程,而我正在努力寻找一种很好的方式来展示它。
任何提示将不胜感激。