在以下代码中,如何使变量AS
可用于回调函数CASE
?
如果我按原样运行代码,sqlite会成功填充songlist
,但是当回调运行时,变量变为complete
。
基本上,我正试图找出一种方法来确保sqlite在console.log(songlist)运行之前完成运行。我认为使用回调会做到这一点,但然后遇到这个变量传递问题。感谢。
songlist
答案 0 :(得分:1)
在您当前的代码中songlist
是全局代码,这意味着它已经可用于您的回调。当您将songlist
参数添加到回调时,您正在对其进行遮蔽,这使得全局不再可见。
你可以简单地说:
var complete = function () {
console.log(songlist);
}
并记录全局对象。
但这并不令人满意,因为一般情况下你应该避免使用全局变量。
更好的想法是在函数中定义songlist
并在完成后将其传递给回调函数:
var complete = function (songlist) {
console.log(songlist);
}
db.serialize(function () {
var songlist = []
db.each("SELECT rowid AS id, info FROM lorem where info like '%" + song + "%'", function (err, row) {
songlist.push(row.info);
console.log("each")
}, function(){
complete(songlist)
}
})
)}
当然你并不需要一个单独的函数 - 你可以直接在回调函数中将songfest记录到你的db函数中。
答案 1 :(得分:0)
通过创建一个匿名函数来传递歌曲列表,如下所示:
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('mydb.db');
var songlist = []
var complete = function (songlist) {
console.log(songlist);
}
db.serialize(function () {
db.each("SELECT rowid AS id, info FROM lorem where info like '%" + song + "%'", function (err, row) {
songlist.push(row.info);
console.log("each")
}, function() { complete(songlist) })
})