节点的目的不是在乎事情发生的顺序。这会使某些情况变得复杂。嵌套回调没有可耻之处。一旦习惯了它的外观,您可能会发现自己实际上更喜欢这种样式。我做;
很清楚将触发什么顺序的回调。如果需要的话,可以放弃匿名函数以使其不再那么冗长。
如果您愿意稍微重构代码,则可以使用“典型”嵌套回调方法。如果您想避免回调,可以使用许多异步框架来尝试并帮助您做到这一点。您可能要检查的一种是async.js(https://github.com/fjakobs/async.js)。每个示例:
app.get('/home', function (req,res) { var lock = 2; var result = {}; result.user_array = []; result.title_array = []; var finishRequest = function(result) { req.session.title_array = result.title_array; req.session.user_array = result.user_array; res.render('home.ejs', {layout: false, locals: { user_name: result.user_array, title: result.title_array }}); }; // first query var q1 = function(fn) { var sql = 'select user_name from users'; db.execute(sql) .addListener('row', function(r) { result.user_array.push( { user_name: r.user_name } ); }) .addListener('result', function(r) { return fn && fn(null, result); }); }; // second query var q2 = function(fn) { var sql = 'select title from pre_samples'; db.execute(sql) .addListener('row', function(r) { result.title_array.push( { title: r.title } ); }) .addListener('result', function(r) { return fn && fn(null, result); }); } //Standard nested callbacks q1(function (err, result) { if (err) { return; //do something} q2(function (err, result) { if (err) { return; //do something} finishRequest(result); }); }); //Using async.js async.list([ q1, q2, ]).call().end(function(err, result) { finishRequest(result); });});一次性,我可能只使用引用计数类型方法。只需跟踪要执行的查询数量,并在查询全部完成后呈现响应即可。
app.get('/home', function (req,res) { var lock = 2; var user_array = []; var title_array = []; var finishRequest = function() { res.render('home.ejs', {layout: false, locals: { user_name: user_array, title: title_array }}); } // first query var sql = 'select user_name from users'; db.execute(sql) .addListener('row', function(r) { user_array.push( { user_name: r.user_name } ); }) .addListener('result', function(r) { req.session.user_array = user_array; lock -= 1; if (lock === 0) { finishRequest(); } }); // second query var sql = 'select title from pre_samples'; db.execute(sql) .addListener('row', function(r) { title_array.push( { title: r.title } ); }) .addListener('result', function(r) { req.session.title_array = title_array; lock -= 1; if (lock === 0) { finishRequest(); } });});更好的方法是在呈现响应之前,在每个“结果”回调中简单地调用finishRequest()以检查非空数组。在您的情况下是否可行取决于您的要求。



