所以我在Node.js开始了一个小项目,以了解它。它是arch linux的软件包系统的一个简单的缓存代理,因为节点提供了大部分繁重的工作。
这有两个“主要”阶段,即服务器设置和服务。 然后服务有两个主要阶段,响应设置和响应。
“主要”设置包括检查一些文件,从文件加载一些配置。从网址加载一些json。然后使用此信息启动http服务器和代理实例。
服务包括检查请求以查看文件是否存在,如果需要创建目录,然后提供响应。
我一直将它们称为同步点,但搜索不会导致很多结果。在流程完成下一步之前必须完成一组异步任务的点。 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中有什么简单的东西吗?有没有一种标准的方法呢?
我想通过这种设置,如果程序变得复杂,那么将会有很多嵌套函数来描述程序的流程,而我正在努力寻找一种很好的方法来解决这个问题。
任何提示将不胜感激。
答案 0 :(得分:3)
你无法让一切都变得同步。 Nodejs旨在异步执行(有时可能会折磨你)。但是有一些方法可以使它以同步方式工作(假设伪代码经过深思熟虑并且代码经过精心设计):
回调和事件易于使用和理解。但有了这些,有时代码可能会变得非常混乱,难以调试。
但是有了承诺,你可以避免这一切。您可以创建依赖链,称为“promises”(例如,仅在Promise A完成时执行Promise B)。
早期版本的node.js实现了promises。他们承诺做一些工作,然后进行单独的回调,为成功和失败以及处理超时而执行。
但在以后的版本中,已被删除。通过从核心node.js中删除它们,它创建了构建模块的可能性,这些模块具有可以位于核心之上的不同promises实现。其中一些是node-promise,futures和promises。
有关详细信息,请参阅以下链接: