0

使用了node sqlite3这个module,其中某个数据表有很多记录,需要用db.all()方法获取并随机选择其中一条返回。但这是个稍微耗时的操作,需要使用async/await。

let sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('example.db');

async function read()
{
    db.all('select * from foo where bar = ?', 1, await function (err, rows) {
        return new Promise (function (resolve, reject) {
            if (rows && rows.length > 0) {
                let key = Math.floor(Math.random() * (rows.length - 0 + 1) + 0);
                resolve(rows[key]);. // 在外部函数中获取这个值
            } else {
                reject(err);
            }
        });
    });
}

怎样才能获取其中rows[key]的返回值?

UPDATE:
根据MDN相关文档,尝试读取这个返回值,但得到的是undefined???

read().then(test => {
    console.log(test);  // 结果是undefined???
});

查看全部 3 个回答

0

awati后要接返回的Promise

推荐答案

1

依據你的問題描述,猜測想做的是:

  • 使用Promise鏈,擺脫 callback hell;
  • 在以上的前提下,等待Promise的返回。

使用Promise

let sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database('example.db');

function read() {
    return new Promise((resolve, reject) => {
        db.all('select * from foo where bar = ?', 1, (err, rows) => {
            if (err !== null) reject(err), retrun;
            
            if (rows && rows.length > 0) {
                let key = Math.floor(Math.random() * (rows.length - 0 + 1) + 0);
                resolve(rows[key]); // 在外部函数中获取这个值
            }
            else reject(err);
        });
    });
}

read().then(console.log);

等待Promise的返回值

(async function () {
    let sqlite3 = require('sqlite3').verbose();
    let db = new sqlite3.Database('example.db');

    function read() {
        return new Promise((resolve, reject) => {
            db.all('select * from foo where bar = ?', 1, (err, rows) => {
                if (err !== null) reject(err), retrun;

                if (rows && rows.length > 0) {
                    let key = Math.floor(Math.random() * (rows.length - 0 + 1) + 0);
                    resolve(rows[key]); // 在外部函数中获取这个值
                }
                else reject(err);
            });
        });
    }

    let result = await read();
    console.log(result);
})();