等待JS中的异步

时间:2015-06-08 03:29:51

标签: javascript node.js express

这是一个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查询。这是另一个问题。

我可能认为这完全错了,但我不知道如何处理这种非常常见的情况。

ANSWER

好的,这很简单,想通了。

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); }
                })
            }
        );
    });

1 个答案:

答案 0 :(得分:3)

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

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