异步等待未在快速节点js中顺序执行功能

存款准备金

我想运行3个数据库查询,然后渲染3个结果对象以供查看,因此我使用async await首先运行查询,但它似乎没有等待/工作,总是在运行查询之前发送空对象以供查看。找不到我出了问题的地方,我正在使用nodejs 12.16.1,不确定它的es6是否支持问题或其他。

var express             = require('express');
var router              = express.Router();
var reviewModel         = require.main.require('./models/review-model');
var propertyModel       = require.main.require('./models/property-model');

router.get('/', async function(req, res){
    try{
        req.cookies['username'] == null ? loginCookie = null : loginCookie = req.cookies['username'];
    
        var getPromoteInfo = await propertyModel.getPromoteInfo(function(result){
            if(result!=null) return result;
        });

        var getPromoteReview = await reviewModel.getPromoteReview(function(result2){
            if(result2!=null)  return result2;
        });

        var getLatest3reviews = await reviewModel.getLatest3reviews(function(result3){
            if(result3!=null)  return result3;
        });

        res.render('index', {property:getPromoteInfo, rating:getPromoteReview, testimonials:getLatest3reviews, loginCookie});
    }
    catch(err){console.log(err);}
});

module.exports = router;

型号代码:

var db = require('./db');

module.exports = {
    getPromoteInfo: function(callback){
        var sql = "select * from property where promote_status = 1;";
        db.getResult(sql, null, function(result){
            if(result){
                callback(result);
            }else{
                callback(null);
            }
        });
    }
}
EOL

您正在使用await不会返回Promise结果undefined值的函数。因此,为了async/await正常工作,您可以getPromoteInfo按以下方式重写

var db = require('./db');

module.exports = {
    getPromoteInfo: function(){
        return new Promise( (resolve, reject) => {
           var sql = "select * from property where promote_status = 1;";
           db.getResult(sql, null, function(result){
              if(result){
                resolve(result);
              }else{
                // you can decide whether to reject or not if no records were found
                reject();
              }
           });
        });
        
    }
}

然后,您可以在快速处理程序中简单地执行await此函数调用,而无需传递回调:

const getPromoteInfo = await propertyModel.getPromoteInfo();

请注意,您可以检查db-client / library是否开箱即用地支持诺言-那么您不必手动将函数包装在诺言中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章