2017-04-17 84 views
1

我無法調整到節點/ js/typescript的異步優先性質。這個小函數的意圖應該非常清楚:它需要一個數據庫並返回該數據庫中列出的一系列課程。同步運行節點sqlite3代碼

問題是,在任何數據庫操作運行之前,return語句都會運行,並且我得到一個空列表。當我在數據庫each循環內設置一個斷點時,我可以看到正在找到這些行,並且這些路線將逐個放入ret,但這些路線在調用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); 
}); 

更多