【问题标题】:nodejs-sqlite3 can't return from callbacknodejs-sqlite3 无法从回调中返回
【发布时间】:2016-01-07 23:21:21
【问题描述】:

我正在尝试返回SELECT 查询的结果,但由于nodejs-sqlite3 api 的构造方式,我需要通过回调获取数据。没问题我想了就做了如下。

var selectAllQuery =
        'SELECT * FROM challenge',
    selectQuery =
        'SELECT * FROM challenge WHERE signature = $signature';

exports.read = function (sig) {
    var result = [],
        callback = function(err, rows) {
            result = rows; // rows contains 3 items
        };

    db.serialize(function () {
        if (sig) db.all(selectQuery, {$signature: sig}, callback);
        else db.all(selectAllQuery, callback);
    });
    console.log(result); // prints []
    return result; // array is empty
};

正如您可能从 cmets 中看到的,我的代码返回一个空数组,尽管在调用回调时 rows 包含数据。

有什么帮助吗?

【问题讨论】:

    标签: javascript node.js sqlite callback


    【解决方案1】:

    问题是您的 read() 函数在调用 DB 回调之前返回。您的read() 函数还需要接受一个回调参数,并在发生错误或数据可用时调用它。这是一个常见的 Node 习语。

    更新 1 -- 你需要这样做:

    exports.read = function (sig, callback) {
        var result = [];
    
        db.serialize(function () {
            if (sig) db.all(selectQuery, {$signature: sig}, callback);
            else db.all(selectAllQuery, callback);
        });
    };
    

    【讨论】:

    • 没有别的办法了吗?我不想让我的系统因不必要的回调而混乱
    • 由于您无法从回调中返回,因此没有一个是不必要的。如果您需要自上而下的程序代码,请使用 php。
    • 我刚刚尝试了回调,它仍然不起作用。它会导致功能链中更高一级的完全相同的问题。它必须在某处终止
    • 编辑您的问题并发布您更新的代码。我敢打赌你错误地调用了回调。
    • 我以完全相同的方式调用它
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 2018-05-23
    • 2017-01-27
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多