2017-04-17 5 views
1

node/js/typescriptのasync-first性質に合わせて調整できません。この小さな関数の目的は、はっきりしているはずです。データベースを取り、そのデータベースにリストされているコースの配列を返します。ノードsqlite3コードを同期して実行しています

問題は、データベース操作が実行される前にreturnステートメントが実行され、空のリストが取得されることです。データベースeachのループ内にブレークポイントを設定すると、行が見つかっており、コースがretに1つずつ入れられていることがわかりますが、これらのコースはcourseList()というスコープでは表示されません。

const courseList = (database: sqlite3.Database): Course[] => { 
    let ret = new Array<Course>(); 

    database.serialize(); 
    database.each("select ID, Title from Course", (err: Error, row: Object) => { 
     ret.push(new Course(
      row.ID, 
      row.Title 
     )) 
    }) 

    return ret; 
} 

提案ですか?

呼び出しコードは、コースに関する情報を印刷するだけです。たとえば、

let courses = courseList(db); 
console.log(courses.length); // logs 0, even though the db contains courses 
+0

NodeJSの特別な機能はありません。上位機能、特にコールバックです。あなたは呼び出しコードを表示できますか? –

+1

これを確認してください:http://stackoverflow.com/questions/39106668/node-js-sqlite3-read-all-records-in-table-and-return – orhankutlu

+0

@AluanHaddadコーリングコードの例をいくつか追加しました。 – NiloCK

答えて

0

database.eachが完全なコールバックをとります。これを使用して、たとえば再開します。

const courseList = (database: sqlite3.Database, complete): Course[] => { 
    let ret = new Array<Course>(); 

    database.serialize(); 
    database.each("select ID, Title from Course", (err: Error, row: Object) => { 
     ret.push(new Course(
      row.ID, 
      row.Title 
     )) 
    }, complete); 

    return ret; 
} 
let courses = courseList(db,() => { 
    console.log(courses.length); 
}); 

もっと

関連する問題