簡體   English   中英

如何使變量可用於javascript中的回調函數

[英]How to make a variable available to a callback function in javascript

在下面的代碼中,如何使可用於回調函數的變量songlist complete

如果我按原樣運行代碼,則sqlite成功填充了songlist ,但運行回調時,變量變為null

基本上,我試圖找到一種方法來確保sqlite在console.log(songlist)運行之前完成運行。 我以為使用回調會做到這一點,但隨后遇到了該變量傳遞問題。 謝謝。

    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")
        }, complete)

    })

在您當前的代碼中, songlist是全局的,這意味着您的回調已經可以使用它。 當您將songlist參數添加到回調中時,您將對其進行陰影處理,這將使全局不再可見。

您可以簡單地說:

var complete = function () {
    console.log(songlist);
}

並記錄全局對象。

但這不是很令人滿意,因為在並非絕對必要時,通常應避免使用全局變量。

一個更好的主意是在函數中定義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函數的回調中即可。

通過創建一個匿名函數來傳遞歌曲列表,如下所示:

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

})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM