栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Node.js同步数据库查询

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Node.js同步数据库查询

节点的目的不是在乎事情发生的顺序。这会使某些情况变得复杂。嵌套回调没有可耻之处。一旦习惯了它的外观,您可能会发现自己实际上更喜欢这种样式。我做;
很清楚将触发什么顺序的回调。如果需要的话,可以放弃匿名函数以使其不再那么冗长。

如果您愿意稍微重构代码,则可以使用“典型”嵌套回调方法。如果您想避免回调,可以使用许多异步框架来尝试并帮助您做到这一点。您可能要检查的一种是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()以检查非空数组。在您的情况下是否可行取决于您的要求。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/409702.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号