阻止我使用像 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() 中返回空结果
明白了:
事实证明,使用 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' }
]
正如我所期待的那样。