2017-09-30 20 views
0

次のコードでは、songlistという変数をコールバック関数completeで使用できるようにするにはどうすればよいですか?javacriptのコールバック関数で変数を使用する方法

コードをそのまま実行すると、sqliteはsonglistを正常に埋め込みますが、コールバックを実行すると変数はnullになります。

基本的に、私はconsole.log(songlist)が動作する前にsqliteが実行を完了するための方法を見つけようとしています。私はコールバックを使用してそれを行うと思ったが、この変数を渡す問題に実行します。ありがとう。怒鳴る示すよう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) 

    }) 

答えて

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

あなたが本当に別々の機能を必要としない - あなただけのログインができあなたのdb関数へのコールバックで直接songfest。

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

}) 
+0

ありがとうございます。グローバル変数を使用するほうが簡単ですが、ソリューションも機能します。 –

+0

絶対に言えば、グローバルスコープであり、必要はなく、最初の解決策は簡単です。ただし、匿名関数のテクニックは、グローバル変数を使用しないすべての状況で機能します。将来的には、アプリケーションが大きくなり、すべてがモジュール化される場合があります。 –

関連する問題