[英]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.