NodeJS 异步函数调用和 SQLite3

问题描述 投票:0回答:1

阻止我使用像 NodeJS 这样的东西的原因之一是异步函数调用,我似乎无法理解它。目前我正在强迫自己将 Perl/Dancer2 应用程序重写为 NodeJS。看来其他维护者无法搞清楚 Perl 的情况。去算一下:S

无论如何,我确实再次遇到了异步问题。并给自己做了一个测试。看来我终于让这头野兽动起来了。但由于某些原因我不理解它的 SQLite,它现在正在运行。

我自己编写了以下小脚本:

const sqlite3 = require('sqlite3').verbose();

const db = new sqlite3.Database('./db/presence.sqlite');

function getLocaties(){
    return new Promise((resolve)=>{
        var locaties = [];
        var qry = "Select naam From locaties";
        db.all(qry,[],(err,row)=>{
            if(err){throw err;}
            locaties.push(row);
        });
        resolve(locaties);
    });
}

async function asyncCall(){
    const result = await getLocaties();
    console.log(result);
    console.log('blaat');
}
console.log('asyncCall returns: ');
asyncCall()
.then(() =>{
    console.log('doing it flat: ');
    var qry = "Select naam From locaties";
    db.all(qry,[],(err,row)=>{
        if(err){throw err;}
        console.log(row);
    });
});

这会呈现以下输出:

asyncCall returns: 
[]
blaat
doing it flat: 
[
  { naam: 'presence.ict.writer' },
  { naam: 'presence.test.reader' },
  { naam: 'presence.test.writer' },
  { naam: 'presence.test2.writer' }
]

我无法理解为什么 JQLite 查询在 getLocaties() 中返回空结果

node.js sqlite
1个回答
0
投票

明白了:

事实证明,使用 db.all() 并移动resolve() 就可以了。我什至不再需要中间位置数组。

function getLocaties(){
    return new Promise((resolve)=>{
        var qry = "Select naam From locaties";
        db.all(qry,[],(err,rows)=>{
            //console.log(row);
            resolve(rows);
        });
    });
}

给了我输出:

asyncCall returns: 
[
  { naam: 'presence.ict.writer' },
  { naam: 'presence.test.reader' },
  { naam: 'presence.test.writer' },
  { naam: 'presence.test2.writer' }
]
blaat
doing it flat: 
[
  { naam: 'presence.ict.writer' },
  { naam: 'presence.test.reader' },
  { naam: 'presence.test.writer' },
  { naam: 'presence.test2.writer' }
]

正如我所期待的那样。

© www.soinside.com 2019 - 2024. All rights reserved.