因此,我在 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/