javascript - 在 Node.js 中努力解决异步同步问题

标签 javascript node.js asynchronous

因此,我在 Node.js 中启动了一个小项目来了解一些相关知识。它是 arch Linux 软件包系统的一个简单缓存代理,因为 Node 提供了大部分繁重的工作。

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

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

  • 设置记录器/选项 - 读取配置 - 读取镜像 - 读取网络镜像
  • 开始服务

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

  • 检查请求 - 检查目录 - 检查文件
  • 代理请求或提供文件

我一直将它们称为同步点,但搜索不会产生很多结果。在流程完成下一步之前必须完成一组异步任务的点。 Perl's AnyEvent has conditional variables我想这就是我想要做的,没有阻碍。

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

经过一番哀嚎和咬牙切齿,我最终得到了一个“服务员”功能,使用 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 中是否有一些简单的东西我忽略了?有这样做的标准方法吗?

我想通过这种设置,如果程序变得复杂,就会有很多嵌套函数来描述程序的流程,而我正在努力寻找一种好的方法来将其全部布局。

任何提示将不胜感激。

最佳答案

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

  • 使用回调
  • 使用事件
  • 使用 promise

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

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

早期版本的 Node.js 已经实现了 Promise。他们 promise 做一些工作,然后分别执行成功和失败的回调以及处理超时。

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

请参阅以下链接了解更多信息:

关于javascript - 在 Node.js 中努力解决异步同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15111346/

相关文章:

node.js - Express js 设置在哪里?

javascript - JavaScript 循环中的异步调用 - Apache Cordova

asynchronous - 关于openai基线A2C实现的问题

javascript - 什么是window._jqjsp?

javascript - 当加载不同参数的相同 url 时,Angular2 路由器 2.0.0 不重新加载组件?

javascript - 不能使用 replaceAll 或替换为 nextjs/reactjs

javascript - 为什么setInterval每次循环一次,都会抛出所有循环的所有数据?

iphone - 为什么 Objective-C 将 JSON 值转换为 ASCII 字符代码的散列?

http - 从 ASP.NET WebApi 使用 HttpClient 异步读取分块内容

javascript - 使用javascript动态创建元素