node.js的闭包函数中怎样使用async/await?

使用了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???
});
阅读 8.9k
3 个回答

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

  • 使用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);
})();

楼上的解决方案可以,另外async/await不是这样用的,你既然都read().then去取结果了,你还用什么async/await。。。

应该这样用

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);
        });
    });
}

async function asyncRead(){
    let result = await read();
    console.log(result);
}

asyncRead();

awati后要接返回的Promise

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题