在node.js中同步asynchronous

所以我在Node.js中开始了一个小项目来学习一些。 这是一个简单的caching代理arch Linux的包系统,因为节点提供了大部分繁重的工作。

这有两个“主要”阶段,服务器设置和服务。 然后服务有两个主要阶段,响应设置和响应。

“主”设置涉及检查一些文件,从文件加载一些configuration。 从一个Web地址加载一些JSON。 然后用这个信息启动http服务器和代理实例。

  • 设置logging器/选项 – 读取configuration – 读取镜像 – 读取webmirror
  • 开始服务

服务涉及检查请求以查看文件是否存在,如果需要则创build目录,然后提供响应。

  • 检查请求 – 检查目录 – 检查文件
  • 代理请求或服务文件

我一直将它们称为同步点,但search不会导致很多结果。 在进程完成下一步之前必须完成一组asynchronous任务的点。 Perl的AnyEvent有条件variables ,我猜是我试图做的,没有阻塞。

首先,我发现我是“作弊”,并使用提供的任何function的同步版本,但必须停止与Web请求,所以我开始重组的东西。 立即大多数search导致使用asynchronous或步骤来控制stream量。 首先,我尝试了大量的系列/并行设置,但是如果在函数下面有任何asynchronous调用会立即“完成”并且系列将会完成,则会遇到问题。

经过多次的唠叨和咬牙切齿之后,我最终用了一个“服务员”function,使用async.until来testing在启动下一个function之前完成的所有任务所设置的一些程序状态。

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

它让我觉得这是一个相当庞大而又丑陋的过程,需要一个模块来实现我认为是标准的东西,所以我想知道什么是更好的方法。 我还在用非asynchronous的方式思考? 有没有简单的节点,我忽略了? 有没有这样做的标准方式?

我想用这个设置,如果程序变得复杂,将会有很多嵌套函数来描述程序的stream程,而且我正在努力看到一个很好的方法。

任何提示将不胜感激。

你不能真的让所有的东西都是同步的。 Nodejs被devise为asynchronous执行(这当然可能会折磨你)。 但是有一些方法可以使其以同步的方式工作(假设伪代码是精心devise的,代码是仔细devise的):

  • 使用callback
  • 使用事件
  • 使用承诺

callback和事件很容易使用和理解。 但有了这些,有时代码可能会变得很混乱,很难debugging。

但是有了承诺,你可以避免这一切。 您可以创build依赖链,称为“promise”(例如,只有在Promise A完成时才执行Promise B)。

早期版本的node.js实现了promise。 他们答应做一些工作,然后分别执行callback,以执行成功和失败以及处理超时。

但在后来的版本中,这被删除。 通过从核心node.js中删除它们,创build了可以在不同核心之上实现承诺的模块。 其中有些是节点承诺 , 期货和承诺 。

查看这些链接了解更多信息:

  • 骨架
  • 承诺和期货
  • 延期承诺 – jQuery