0

我有以下代码与 SQLite3 npm 模块一起使用。

db.all("SELECT * FROM posts WHERE id = '3', function(err, rows) {
   return rows
})

我想从rows这段代码之外访问数据,例如......

db.all("SELECT * FROM posts WHERE id = '3', function(err, rows) {
   return rows
}) 

// >>> *** I want to call the results for rows here ***

有人可以用一个简单的例子来解释这是如何完成的吗?

4

2 回答 2

0

您不能从回调外部访问行,因为是异步的,回调会告诉您何时可以实际使用它。

但是,async / await如果您不喜欢嵌套回调,则可以使用:

const { promisify } = require('util');

const dbAllAsync = promisify(db.all);

(async function() {
    const rows = await dbAllAsync("SELECT * FROM posts WHERE id = '3'");
    console.log(rows); // you can use rows here
})();

警告

检查您的节点版本是否支持promisify. 如果它不使用诸如 bluebird 之类的库。同样适用async / await,在这种情况下,您可以使用诸如 babel 之类的编译器,或者只是升级节点 :)

于 2018-02-20T13:22:01.807 回答
0

你可以使用 Promise,例如:

new Promise(function (resolve, reject) {
  db.all("SELECT * FROM posts WHERE id = '3', function(err, rows) {
    // Check if there's an error, if it exists the promise will end up.
    if (err) {
      reject(err)
      return
    }

    resolve(rows)
  })
}).then(function (rows) {
  // You can make use of your code here
}).catch(function (err) {
  console.log(err)
})

Promise 是异步执行的,因此resolved一旦从您的数据库中读取数据就会发生。

你去这里学习更多。文档很棒。

于 2018-02-20T13:17:19.630 回答