Javascript node.js中的异步同步问题

Javascript node.js中的异步同步问题,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,因此,我在Node.js中启动了一个小项目来了解它。它是ArchLinux包系统的一个简单缓存代理,因为node提供了大部分繁重的工作 这有两个“主要”阶段,服务器设置和服务。 然后服务有两个主要阶段,响应设置和响应 “主”设置包括检查一些文件,从文件加载一些配置。从web地址加载一些json。然后使用此信息启动http服务器和代理实例 设置记录器/选项-读取配置-读取镜像-读取webmirror 开始发球 服务包括检查请求以查看文件是否存在,如果需要,创建目录,然后提供响应 检查请求-检

因此,我在Node.js中启动了一个小项目来了解它。它是ArchLinux包系统的一个简单缓存代理,因为node提供了大部分繁重的工作

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

“主”设置包括检查一些文件,从文件加载一些配置。从web地址加载一些json。然后使用此信息启动http服务器和代理实例

  • 设置记录器/选项-读取配置-读取镜像-读取webmirror
  • 开始发球
服务包括检查请求以查看文件是否存在,如果需要,创建目录,然后提供响应

  • 检查请求-检查目录-检查文件
  • 代理请求或服务文件
我一直把它们称为同步点,但搜索不会产生很多结果。在流程完成下一步之前必须完成一组异步任务的点。我想这就是我想要做的,没有阻碍

首先,我发现我在“作弊”,并使用提供的任何函数的同步版本,但这必须随着web请求而停止,因此我开始重新构造。大多数搜索立即导致使用异步或控制流。首先,我尝试了大量的串行/并行设置,但如果函数下面有任何异步调用,就会立即“完成”,系列就会完成

经过一番哀嚎和咬牙切齿之后,我最终得到了一个使用的“服务员”函数。在此之前,我测试了在启动下一个函数之前,所有任务完成后要设置的程序状态

// 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()
        }
    );
}
它给我的印象是相当大和丑陋,需要一个模块来实现一些我认为是标准的东西,所以我想知道什么是更好的方法。我是否仍在以非异步方式思考?节点中是否有我忽略的简单内容?有没有一个标准的方法可以做到这一点

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


任何提示都将不胜感激

你不可能让所有事情都同步。Nodejs被设计为异步执行(这当然有时会折磨您)。但有几种方法和技术可以使其以同步方式工作(前提是伪代码经过深思熟虑,代码经过精心设计):

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

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

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

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

有关更多信息,请参见以下链接:


好的,承诺,现在我有东西要找。知道node为什么要删除它们吗?@mindthemonkey node.js core中曾经提供的承诺是基于EventEmitter的,与现代承诺/A+承诺完全不同。它们被删除是因为过于复杂而没有增加太多好处,因为与Promises/A+不同,我认为Node拥有的那些是不可链接的,不会传播错误,并且与当前的节点样式相比,注册回调的方式要详细得多。然而,这些问题都不存在于Promises/A+Promises中,在我看来,这是一个比Node的回调更好的异步基础,而这正是我3年后的结局。主要是蓝鸟。