方法不是我寫的,是從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,程序到此結束或者有結果。如果最終方法只是個普通方法還有其他回調什么的,則沒必要這樣用
