清远 网站建设,wordpress 评论调用,学做PPT报告的网站,中国公路建设行业协会网站我们都知道node是基于事件无阻塞i/o模型的#xff0c;所以说大部分函数都是以异步实现的#xff0c;请看下面代码#xff1a; db.query(sql1, function (err, data) {//code
})db.query(sql2, function (err, data) {//code
})如果我们上述两个操作#xff0c;结果之间没有… 我们都知道node是基于事件无阻塞i/o模型的所以说大部分函数都是以异步实现的请看下面代码 db.query(sql1, function (err, data) {//code
})db.query(sql2, function (err, data) {//code
})如果我们上述两个操作结果之间没有什么联系那很好基于node的I/O无阻塞模型每个操作都做着自己的事情美滋滋~ 但是在一些情况下这两个操作的结果有联系的比如说第一个操作从数据库中取出一个人的姓第二个操作从数据库中取出同一个人的名。 假设我们有一个需求就是我们要把这两个操作的结果组合起来变成一个人的姓名这个操作貌似有点浮夸嘻嘻也就是说我们要组合成姓名这个操作必须是在姓和名都取到的情况下才能进行可达鸭眉头一皱发现事情并不简单。我们知道上述两个操作是异步操作他们何时结束我们根本不能知道只知道他结束时会执行回调函数。下面我们就用订阅发布者模式来解决它。请看下面代码 var count 0;
var results {};
var done function (key, value) { //订阅,姓和名进行订阅results[key] value;count;if(count 2) {//发布也就是执行刚刚说的组成姓名的操作 var name results.lastName results.firtName;}}db.query(sql1, function (err, data) {//这里data我们假设是从数据库取到姓done(lastName, data);
})db.query(sql2, function (err, data) {//这里data我们假设是从数据库取到名done(firstName, data);
}) 这样一来每个i/o完成都会执行done方法把取到的数据存到results对象中也就是订阅而当订阅数等于2的时候也就是两个操作都完成并且都把数据存在results中了那么就可以发布也就是执行组成姓名的操作。利用订阅/发布者模式实现多对一基本完成了我们的需求但是这样的代码是丑陋的我们用闭包和偏函数把代码优化并且抽象一下以适合更多的需求。改进代码如下 var after function (times, callback) {var count 0,results {};return function (key, value) {results[key] value;count;if(count times) {callback();}};
};//对闭包的引用
var done after(times, render); ps:利用node的events模块我们还可以实现订阅/发布者的多对多模式。 参考资料深入浅出Node.js第4章 转载于:https://www.cnblogs.com/yonglin/p/7868062.html