在node.js中遇到异步同步

时间:2013-02-27 11:48:27

标签: javascript node.js asynchronous

所以我在Node.js开始了一个小项目,以了解它。它是arch linux的软件包系统的一个简单的缓存代理,因为节点提供了大部分繁重的工作。

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

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

  • setup logger / options - read config - read mirrors - read webmirror
  • 开始服务

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

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

我一直将它们称为同步点,但搜索不会导致很多结果。在流程完成下一步之前必须完成一组异步任务的点。 Perl's AnyEvent has conditional variables我想我正在尝试做的事情,没有阻止。

首先,我发现我“欺骗”并使用所提供的任何功能的同步版本,但必须停止Web请求,所以我开始重组事情。大多数搜索立即导致使用异步或step来控制流量。首先,我尝试了很多系列/并行设置,但如果在函数下面有任何异步调用将立即“完成”并且系列将完成,则遇到问题。

在多次哭泣和咬牙切齿之后,我最终使用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()
        }
    );
}

令我感到震惊的是,它相当大而且丑陋,需要一个模块来实现我认为标准的东西,所以我想知道什么是更好的方法。我还在以非同步的方式思考吗?我忽略了Node中有什么简单的东西吗?有没有一种标准的方法呢?

我想通过这种设置,如果程序变得复杂,那么将会有很多嵌套函数来描述程序的流程,而我正在努力寻找一种很好的方法来解决这个问题。

任何提示将不胜感激。

1 个答案:

答案 0 :(得分:3)

你无法让一切都变得同步。 Nodejs旨在异步执行(有时可能会折磨你)。但是有一些方法可以使它以同步方式工作(假设伪代码经过深思熟虑并且代码经过精心设计):

  • 使用回调
  • 使用活动
  • 使用承诺

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

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

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

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

有关详细信息,请参阅以下链接: