2

所以我在 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 中有什么简单的东西吗?有这样做的标准方法吗?

我想通过这种设置,如果程序变得复杂,将会有很多嵌套函数来描述程序的流程,而我正在努力寻找一种很好的方式来展示它。

任何提示将不胜感激。

4

1 回答 1

3

你不能真正让一切都同步。Nodejs 被设计为异步执行(这当然有时会折磨你)。但是有几种方法可以使其以同步方式工作(假设伪代码经过深思熟虑并且代码经过精心设计):

  • 使用回调
  • 使用事件
  • 使用承诺

回调和事件易于使用和理解。但是有了这些,有时代码会变得非常混乱且难以调试。

但是有了 Promise,你就可以避免这一切。您可以创建依赖链,称为“promises”(例如,仅在 Promise A 完成时执行 Promise B)。

早期版本的 node.js 实现了 Promise。他们承诺做一些工作,然后有单独的回调,将执行成功和失败以及处理超时。

但在后来的版本中,它被删除了。通过将它们从核心 node.js 中删除,它创造了构建具有不同承诺实现的模块的可能性,这些承诺可以位于核心之上。其中一些是node-promisefuturespromises

有关更多信息,请参阅这些链接:

于 2013-02-27T12:09:45.927 回答