资料
nodejs的高性能与灵活性让服务端开发变得有了些乐趣,最近在看nodejs在服务端的一些应用,觉得其npm下的众多开源包让其虽没有大型的框架 却能更自由的引用外部的模块编写属于自己风格的代码架构。
学习过程中,最让人觉得头痛的地方,个人觉得是异步执行,习惯了顺序执行代码的开发过程,开始的时候,因为面向对象的思想,封装继承多态的理论已经深入各编程语言,所以在进行设计的时候,好好的跌了一个跟头,发现原本清晰的业务逻辑,在执行后变得换乱不堪,其原因多在代码没有按照我的顺序或逻辑在执行。
后来才知道,原来上面遇到的问题是所有学习js的人都会经过的“名坑”,解决的方法也有很多。
其中最简单的一种就要属回调函数了,在js中,方法可以作为参数传递是其比较有趣的一个地方,而js中的异步执行造成 方法间的数据传递很不方便,需要借助回调函数的方式才能使用,但在回调函数以外,如果想用到这个数据,就要等这个方法执行完毕,而调用代码执行的时候,可能数据赋值的代码还未执行完,造成取不到值。
简单的回调函数 虽然解决了代码顺序执行的问题,但接下来,问题又来了,那就是回调函数之间,是嵌套的,深度的逻辑嵌套才能造成回调函数的正确执行逻辑和拿到我们想要拿到的数据,虽然在写回调函数加上注释的时候,个人觉得代码是更加流畅和可靠的,但在其可读性和代码量上 又是一个新的挑战。业务流程逐渐的加多,数据间的关系逐渐复杂时,业务之间的代码块变得越来越庞大和不易维护,相同作用的代码写了一遍又一遍,数据的传递也越发的困难和混乱。
试过了node中的很多种流程控制的方法,最舒服的就该属async了。
引用async模块,可以很好的实现代码的控制,保持代码的美观,其他的方法就不介绍了,在这里介绍一个auto方法,通过定义的function参数 、回调函数和数据结果集、方法间的相互依赖关系 可以很轻松的制定出代码规范的业务流程,使自己的业务逻辑既可以顺序执行,又对一些不必顺序执行的部分实施异步执行。
var async = require('async'); var funclist = { func1: function (callback, results) { console.log('func1执行,传入值{name:123}') callback(null, {name:'123'}); }, func2: function (callback, results) { console.log('func2执行,传入值 { "puncha": "during" }') //console.log(results); callback(null, { "puncha": "during" }); }, func3: ["func2", function (results, callback) { console.log('func3在func2执行后执行,传入值 3') // console.log(results); callback(null, 3); }], func4: ["func3", function (results,callback) { console.log('func4在func3执行后执行,总体执行结果为:') console.log(results); callback(null); }] }; async.auto(funclist);
以上代码执行结果为:
func1执行,传入值{name:123} func2执行,传入值 { "puncha": "during" } func3在func2执行后执行,传入值 3 func4在func1执行后执行(根据以上逻辑,执行顺序为 func1先执行,func2,4并行,func3最后执行 ),总体执行结果为: { func1: { name: '123' }, func2: { puncha: 'during' }, func3: 3 }