我正在使用带有电子模块的node.js的sqlite3模块。我是javascript的新手,我正在努力应对回调和异步代码。
我的目的是让getTable函数运行,构建表数组并将该数组传递给回调函数,即useTable函数。
所以这个函数应该构建并传递表数组:
function getTable(callback) {
const sqlite3 = require('sqlite3').verbose();
var testDatabase = new sqlite3.Database('app/data/testDatabase.db');
var table = [];
var testRow = [];
testDatabase.each("SELECT * FROM test_Accounts", function(err, row) {
testRow.push(row.test_id);
testRow.push(row.test_creation_date);
testRow.push(row.domain);
testRow.push(row.test_login_url);
table.push(testRow);
testRow = [];
});
testDatabase.close();
callback(table);
}
此函数将获取表数组并使用它:
function useTable(table) {
//code that uses the table array passed to this function from the getTable function.
}
我会像这样运行:
getTable(useTable);
当我运行它时,控制台显示没有错误。似乎useTable函数在getTable函数中完成表数组之前运行,我认为这是回调的主要目的之一,等待异步代码运行(在这种情况下构建一个数组),然后再获取该数组和将它传递给另一个函数。
如何确保getTable函数中的表数组在传递并运行useTable函数之前完全生成?
答案 0 :(得分:1)
您应该使用testDatabase.all('SELECT * from test_accounts',callback)
函数一次获取所有行。例如:
null
请参阅文档:
使用指定的参数运行SQL查询,然后使用所有结果行调用回调。 https://github.com/mapbox/node-sqlite3/wiki/API#databaseallsql-param--callback
还有一个注意事项:在NodeJS中,当您调用回调函数时,建议您将第一个返回值用作error
或function useTable(err,table){
if (err){
throw Err
}
else {
// Do something with the data
}
}
getTable(useTable)
值。
users
-id
-name
permissions
-id
-name
user_permissions
-user_id
-permission_id
-read
-write
-update
-delete