如何在javascript中使变量可用于回调函数

时间:2017-09-30 17:23:15

标签: javascript callback

在以下代码中,如何使变量AS可用于回调函数CASE

如果我按原样运行代码,sqlite会成功填充songlist,但是当回调运行时,变量变为complete

基本上,我正试图找出一种方法来确保sqlite在console.log(songlist)运行之前完成运行。我认为使用回调会做到这一点,但然后遇到这个变量传递问题。感谢。

songlist

2 个答案:

答案 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) })

})