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

发布于 2022-09-05 09:39:07 字数 1078 浏览 20 评论 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???
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

一曲琵琶半遮面シ 2022-09-12 09:39:07

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

  • 使用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);
})();
笙痞 2022-09-12 09:39:07

楼上的解决方案可以,另外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();
同尘 2022-09-12 09:39:07

awati后要接返回的Promise

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文