【问题标题】:Correctly using callbacks to wait for query completion正确使用回调等待查询完成
【发布时间】:2017-01-10 23:07:29
【问题描述】:

我正在尝试编写一段可重用的代码来查询数据库(带有一些参数),然后对该数据执行操作并返回一些新创建的数据。我的大致是这样的:

function loadList(config) {
    var list = [];

    var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";

    connection.query(queryString, function (err, result) {
        if err throw err;

        for (var i = 0; i < result.length; i++) {
            //Perform some action on the data
            //IMPORTANT this changes the list variable
        }
    });

    return list;
}

现在,这段代码不起作用,该函数几乎在所有情况下都会返回[]。这是因为return list 在查询回调运行之前很久就执行了。但是,看在上帝的份上,我无法弄清楚如何构造我的代码,以便 parent 函数的return list 运行 查询和回调都已执行.可能是因为我累了,但我实在看不出来解决办法。

我曾考虑在loadList() 中创建一个新的回调函数,该函数从查询中调用,但如果我从该回调中调用return list,它只会为该回调返回list,而不是父级功能。

实现这个的正确方法是什么?

【问题讨论】:

    标签: mysql node.js express callback


    【解决方案1】:

    你应该使用回调基函数,像这样:

    function loadList(config, callback) {
    
        // check that callback is not null
        callback = callback || function() {};
    
        var list = [];
    
        var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
    
        connection.query(queryString, function(err, result) {
            if (err) {
                return callback(err);
            }
    
            for (var i = 0; i < result.length; i++) {}
    
            // after you done your work call the call back
            return callback(null, list);
        });
    }
    

    用法:

    loadList(config_here, function(err, list) {
        if (err) {
            // do something with err
        }
    
        // here you have the list
    })
    

    【讨论】:

    • 好的,谢谢你的提示。这个回调基函数,它大致是什么样子的?像function coolCallback(err, list) {//code here} 这样的东西?将err 传递给回调背后的想法是什么?编辑:您的编辑说得很清楚!谢谢!
    • 在模块中最好将err 提供给模块的调用者,该函数决定如何处理错误,throw 它,print 它或等等。
    • 我遇到了同样的问题,但不明白为什么你在返回回调(null,list)中使用“null”作为第一个参数;
    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 2016-02-17
    • 2021-03-23
    • 2019-01-30
    • 2016-10-25
    • 2020-03-22
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多