返回未定义的Nodejs SQLite回调执行

时间:2019-12-16 20:44:37

标签: javascript node.js sqlite

因此,我知道这是一个已涉及的主题,但是我还没有找到一个示例来演示整个实现。

我只是在尝试进行SQLite db.get调用,并返回一个以后可以使用的对象。

我知道回调在这里很关键,可能是因为我对Javascript / async的理解不够好,但是我需要知道如何从回调中访问返回的对象,但是事实证明这对为了我。 (我对JS非常陌生,主要是Java背景)

以下面的代码为例:

function foo(){
    db.get("SELECT open_hour, open_minut FROM autorun_open", function(err, row) {
        console.log(row.open_hour);
        console.log(row.open_minut);
        row = row.open_hour;
        callback(row);
    });
}

function callback(row) {
    console.log("R:" + row);
} 

如何调用此函数,以便可以从该函数取回row对象?

作为一种伪代码示例,我已经尝试过类似的事情:

let row = foo();
   console.log("My row: " + row);

问题是,当然执行是异步的,并且行始终是未定义的。

实际上如何从此回调中获取行对象?

谢谢大家,对于这个问题与其他问题相似,我深表歉意,但是我一直在寻找其他可能发表的帖子,并且根本找不到一个足以让我理解的示例。

1 个答案:

答案 0 :(得分:0)

根据您的评论,您想在row之外获得function foo()

您必须使用return关键字从函数返回数据,这就是我们在C#或Java中所做的事情

function foo(){
 let row='This is my row data'
  return callback(row);
    
}

function callback(row) {
    console.log("R:" + row);
    return row
} 


let row= foo()

console.log("My row: " + row)

我将示例简化了一点,但是基本概念是您必须使用return

更新

即使您执行async/await,也无法从函数外部获取数据,因为JavaScript是单线程的,并且它不等待函数执行。所有异步内容都由Event Loop处理。

这就像说我想今天读明天的报纸,这是不可能的。 (PS-我在SO上的某处阅读了此行,但找不到源)

长话短说,由于async/await返回数据时,您无法获得外部query调用返回的数据。您的脚本将完成运行并已打印undefined

这不是最好的例子,但我希望它会有所帮助

function async foo(){
       let row='This is my row data'
       await callback(row);

    }

    function async callback(row) {
        console.log("R:" + row);
        await row
    } 


    let row= foo()

    console.log("My row: " + row) //<--- Still undefined because foo() is still working in background and this prints default value of undefined