2016-08-25 9 views
2

JavaScriptを使用してElectronを使用していて、SQLite dbにアクセスしようとしています。 dbの出力は国のリストです。ターゲットはdiv内の単純なulです。このアクションは、ページ上のボタンにアタッチされたonclickイベントによって呼び出されます。SQLite dbにアクセスするJavaScript関数

ここが問題です。技術的に言えば、私はdbにアクセスできます。しかし、データレイヤー(data.js)には、dbファイルから配列を取り込む作業だけを行う2つのオプションがあります。それぞれにあるconsole.log()はデバッグ用です。

オプション1では、return要素は、長さが23で完全に配列された配列を返します(オプション1のイメージを参照)。戻り値要素をdb.all関数から移動すると、空の配列は上に戻りますが、長さは0です(オプション2イメージを参照)。私は最初の選択肢は配列の見方ですが、配列がdb.all関数内に含まれているため、data.jsのgetLocations()に対して何も返しません。その後、model.jsとview.js(以下のコード)の配列は未定義のままです。

オプション2を使用すると、配列はデータ、モデル、ビューなどの行に挿入されますが、「上に空」のため、すべての配列の長さは0のままです。このように、配列の長さが最終的に0で正しくないため、配列を繰り返し処理すると失敗します。

データをjaの配列にハードコードすると、すべて正常に動作し、ページに書き込む国のリスト。 DBファイルからデータを取得することができますが、その必要がありますが、上記の問題が発生するようです。ですから、data.jsがどのように配列を返すのかは本当にすべてです。

正しく配列を取得して正しく処理できるようにするための提案がありますので、それらを繰り返し処理してページに書き込むことができますか?

あなたのお役に立てれます!


Data.jsオプション1:

function getLocations() { 
    var sqlite3 = require('sqlite3').verbose(); 
    var file = 'db/locations.sqlite3'; 
    var db = new sqlite3.Database(file); 
    var larray = []; 

    db.all('SELECT * FROM Country', function(err, rows) { 
     rows.forEach(function(row) { 
      larray.push(row.CountryName); 
     }) 
    console.log(larray); 
    return larray; 
    }); 
} 

Data.jsオプション2:

function getLocations() { 
    var sqlite3 = require('sqlite3').verbose(); 
    var file = 'db/locations.sqlite3'; 
    var db = new sqlite3.Database(file); 
    var larray = []; 

    db.all('SELECT * FROM Country', function(err, rows) { 
     rows.forEach(function(row) { 
      larray.push(row.CountryName); 
     }) 
    }); 
    console.log(larray); 
    return larray; 
} 

オプション1枚の画像: enter image description here

オプション2画像: enter image description here

model.js:

function Locations() { 

    //Pull location values from data 
    var viewLoc = getLocations(); 

    return viewLoc; 
} 

view.js:

function viewLocation() { 

    var viewLoc = Locations(); 

    var container = document.getElementById('wrapper'); 

    for (var i=0; i < viewLoc.length; i++) { 
     container.insertAdjacentHTML('beforeend', '<li>' + viewLoc[i]); 
    } 
}; 

答えて

1

db.all非同期関数です。あなたのデータベースから応答を受け取るまで、コールバック関数はすぐには実行されません。空になり、あなたのconsole.log最後にreturn larrayです - オプション1のために、あなたのコード内で何が起こっている

は、それがdb.all関数を呼び出しますし、それが非同期であるため、それは次の行に移動するということです。

問題を解決するには、 getLocations()にパラメータとしてコールバック関数を取り込ませる必要があります。その後、db.allから応答を受け取ったら、larrayを入力し、コールバックを通じてそれを返します。

例:

data.js

function getLocations(done) { 
    var sqlite3 = require('sqlite3').verbose(); 
    var file = 'db/locations.sqlite3'; 
    var db = new sqlite3.Database(file); 
    var larray = []; 

    db.all('SELECT * FROM Country', function(err, rows) { 
     // This code only gets called when the database returns with a response. 
     rows.forEach(function(row) { 
      larray.push(row.CountryName); 
     }) 
     return done(larray); 
    }); 
} 

model.js

function Locations(done) { 
    return getLocations(done); 
} 

view.js

function viewLocation() { 
    // Pull location values from data 
    var viewLoc = Locations(function(/*OOPS, THIS WAS MISSING!!=*/results) { 
     // Code only gets triggered when getLocation() calls return done(...); 
     var container = document.getElementById('wrapper'); 

     for (var i=0; i < results.length; i++) { 
      container.insertAdjacentHTML('beforeend', '<li>' + results[i]); 
     } 
    }); 
} 

あなたのコードをもう一度見ています。 はLocation()から返されるものがありますが、現時点では何も返されていませんが、デバッグしようとしている可能性があります。とにかく、それは問題の範囲から外れているので、ここではあまり心配しません。

+0

ありがとう、サミュエル。進行ですが、まだエラーがあります。上記を実装すると、 "TypeError:model.jsから未定義のプロパティ 'length'を読み取ることができません。それは私には、長さはまだ0として来ていることを示唆しています、はい? viewLocation()に関して、私はLocation()に間違ったコードを貼り付けました。元のメッセージは、私が実際に持っているものに修正されました。テストのために、Locations()で提供したコードを使用し、ページボタンから呼び出しました。しかし、私が言及したエラーの考え方と、上記の修正されたコードで全体をどのように実装するかについては、感謝します。 – Steve

+0

@スティーブ - それは私の間違いです。 'getLocations'に渡したコールバック関数にパラメータがありませんでした。私たちは価値を呼び戻すことによって正しいことをしましたが、反対側でそれを検索することを忘れました。私は解決策を更新しました。お試しください –

+0

よろしく!それで、それは幻想的に動作します。どうもありがとうございます!しかし、上記で編集したように、model.jsとview.jsの間にコードを分けて、どのように実装すればよいでしょうか?私は確かに2つを1つにまとめることができましたが、既に成功していますが、私はMVCモデルを維持しようとしています。私はあなたの助けに感謝します!! – Steve

関連する問題