纠结于node.js中的异步同步

Struggling with async synchronisation in node.js

本文关键字:异步 同步 js node      更新时间:2023-09-26

所以我在Node.js中开始了一个小项目来学习一点关于它的知识。它是arch linux包系统的一个简单的缓存代理,因为node提供了大部分繁重的工作。

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

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

  • 设置日志记录器/选项-读取配置-读取镜像-读取webmirror
  • 开始服务

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

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

我一直把它们称为同步点,但搜索不会导致很多结果。在流程完成下一步之前必须完成一组异步任务的点。Perl的AnyEvent有条件变量,我想这就是我想做的,没有阻塞。

一开始,我发现我在"作弊",使用任何提供的同步版本的函数,但这必须停止与web请求,所以我开始重组的东西。大多数搜索立即导致使用异步或步进来控制流。首先,我尝试了很多串联/并行设置,但如果在函数下面有任何异步调用,那么问题就会"完成",系列就会结束。

在苦苦挣扎和咬牙切齿之后,我最终使用async实现了一个"服务员"函数。直到所有任务在启动下一个函数之前完成要设置的某个程序状态的测试。

// 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被设计为异步执行(这当然有时会折磨你)。但是有一些方法可以使它以同步方式工作(前提是伪代码是经过深思熟虑的,并且代码是精心设计的):

    使用回调函数
  • <
  • 使用事件/gh>使用承诺

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

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

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

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

查看这些链接获取更多信息:

  • 承诺与期货
  • 延迟承诺- jQuery