js里一个挺巧妙的同步方法
方法不是我写的,是从http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js看到的,这里写下我的理解
提问者的问题是怎么在node里同步地返回2个query result,即2次查询,一起render。其中一个回答是这样的:
var after = function _after(count, f) { var c = 0, results = []; return function _callback() { switch (arguments.length) { case 0: results.push(null); break; case 1: results.push(arguments[0]); break; default: results.push(arguments); break; } if (++c === count) { f.apply(this, results); } }; }; var g = after(3, function(a,b,c) { alert(a + b + c); }); g(1); g(2); g(3);
前2次执行没有输出,第三次执行弹出结果:6
对这个问题的场景,是这样使用:
var after = function _after(count, f) { var c = 0, results = []; return function _callback() { switch (arguments.length) { case 0: results.push(null); break; case 1: results.push(arguments[0]); break; default: results.push(Array.prototype.slice.call(arguments)); break; } if (++c === count) { f.apply(this, results); } }; }; var handleDatabase = after(2, function (res1, res2) { res.render('home.ejs', { locals: { r1: res1, r2: res2 }): }) db.execute(sql1).on('result', handleDatabase); db.execute(sql2).on('result', handleDatabase);
怎么理解这个代码呢?其实就是利用了闭包的特性,将变量保存在闭包里,等累计次数达成的时候,用function.apply做方法代理,执行了回调函数
另外还需注意,2个例子里,最终方法是alert和render,程序到此结束或者有结果。如果最终方法只是个普通方法还有其他回调什么的,则没必要这样用
sort of, I have some experience in the domain of database(MySQL/mongo), java, python, front-end, etc. I'll willing to give and accept bits of help from others.
now base in Singapore.