2017-10-28 125 views
0

我想选择异步sqlite3数据库的一些数据。但由于db.each是一个异步功能,我以下select功能无法正常工作。 如何添加一个Promise来等待结果?sqlite3 - 承诺异步调用

const sqlite3 = require('sqlite3').verbose(); 

export default function select(database, table) { 
    return new Promise((resolve, reject) => { 
    const db = new sqlite3.Database(database); 
    const queries = []; 
    db.each(`SELECT rowid as key, * FROM ${table}`, (err, row) => { 
     if (err) { 
     reject(err); 
     } 
     console.log(`Push row ${row.key} from database.`); 
     queries.push(row); 
    }); 
    console.log(queries); 
    console.log(JSON.stringify(queries)); 
    }); 
} 

result of codesnippet

回答

1

db.each()需要稍微麻烦,非标准promisification由于其回调的性质,通过它:

  • 提供行,一次一个,以第一个回调,
  • 信号完成到第二个回调。

将其与db.all()中展示的标准模式进行比较,该标准模式采用带签名(err, rows)的单个回调。

坚持用db.each(),你写的是正确的,只是它没有解决完成db.each()的承诺。

幸运的是,解决方案虽然麻烦,但相当简单。可以从第二个回调调用resolve(queries)

export default function select(database, table) { 
    return new Promise((resolve, reject) => { 
     const db = new sqlite3.Database(database); 
     const queries = []; 
     db.each(`SELECT rowid as key, * FROM ${table}`, (err, row) => { 
      if (err) { 
       reject(err); // optional: you might choose to swallow errors. 
      } else { 
       queries.push(row); // accumulate the data 
      } 
     }, (err, n) => { 
      if (err) { 
       reject(err); // optional: again, you might choose to swallow this error. 
      } else { 
       resolve(queries); // resolve the promise 
      } 
     }); 
    }); 
} 

如果行预期的数量是“非常有限”(因为它SQLite的文档中说的),然后使用db.all()代替。

+0

谢谢!欣赏它。 – tomole