在JS中等待Async

Wait for Async in JS

本文关键字:Async 等待 JS      更新时间:2023-09-26

这是一个Express网站。

下面是我编写代码的方式。这只是一些附带的代码,让我试着让一些肮脏的工作:

指数

/ routes.js

    router.get('/', function(req, res) {
        var sqlStatement = "Select top 10 from customers";
        var rows = connection.invokeQuery(sqlStatement);
        res.render('index', { title: 'My App', customers: rows});
    });
module.exports = router;

问题是,在尝试将数据呈现给页面之前,它没有等待查询完成。我试着把它放到回调中,但还是不行。我需要一个承诺或者看守什么的吗?

router.get('/', function(req, res) {
    var sqlStatement = "Select top 10 from customers";
    var rows = connection.invokeQuery(sqlStatement, function(){
            res.render('index', { title: 'My App', customers: rows});
    });
});

我创建了这个方法:

connection.invokeQuery = function(sqlQuery){
...code before this
                db.query(sqlQuery, function(err, rows){
                    if(rows ) {
                        data = rows;
                        console.log(rows);
                    }
                    if(err) { console.log(err); }
                })
            }
        );
    });
    return data;
};

我注意到的另一件事是,在我的invokeQuery函数中,当我启动我的网站时,它立即击中了return data。它甚至还没有击中我的sql查询。这是另一个问题。

我可能完全搞错了,但是我不知道如何处理这个可能非常常见的场景。

好,这很简单,算出来了。

var rows = connection.invokeQuery(sqlStatement, function(rows){
    res.render('index', { title: 'Dave''s App', cobrands: rows});
});
connection.invokeQuery = function(sqlQuery, callback){
...code before this
                db.query(sqlQuery, function(err, rows){
                    if(rows ) {
                        data = rows;
                        console.log(rows);
                        callback(rows);
                    }
                    if(err) { console.log(err); }
                })
            }
        );
    });

不确定您的数据库对象是什么样子,但您可能想要这样的东西,将数据库结果传递给回调。

connection.invokeQuery(sqlStatement, function(rows) {
    res.render('index', { title: 'My App', customers: rows});
});