【问题标题】:Converting from Promise with .then() to async/await使用 .then() 从 Promise 转换为 async/await
【发布时间】:2019-12-14 08:02:02
【问题描述】:

我希望更好地理解 async/await 的概念,以避免嵌套 .then() 数据库调用。以下代码简化代码将正常工作,但我有一些实例希望连续进行多个数据库调用。

var sql = require("sqlite3").verbose();
var db = new sql.Database('db.sqlite');

async function query(sql) {
    return new Promise((resolve, reject) => {
        db.all(sql, [], (err, rows) => {
            resolve(rows);
        });
    });
}

query('SELECT name FROM players')
    .then(rows => console.log("Players are: ", rows.map(p => p.name).join(", ")));

如何将其转换为在优雅的庄园中使用 async/await?

【问题讨论】:

  • 你能展示你想要转换的多个调用的例子吗?
  • 我删除了大量不必要的逻辑,并一直在使用这个示例来尝试更好地理解这一点。当我先插入数据,然后尝试选择有问题时,就会出现这种情况。只是想更好地理解这一点。

标签: javascript sqlite asynchronous promise async-await


【解决方案1】:

像这样转换一个承诺链:

query('SELECT name FROM players')
  .then(rows => console.log("Players are: ", rows.map(p => p.name).join(", ")));

进入async/await,可以这样做:

async function example() {
  const rows = await query('SELECT name FROM players');
  console.log("Players are: ", rows.map(p => p.name).join(", "));
}

注意:await (currently) 只能在 async 函数中使用,不能全局使用。

【讨论】:

    【解决方案2】:
    var sql = require("sqlite3").verbose();
    var db = new sql.Database('db.sqlite');
    
    
    const query = async (sql) => {
        let response;
        await db.all(sql, [], (err,rows) => {
          response = rows;
        })
        return response;
    }
    
    const getRows = async () => {
       const rows = await query('SELECT name FROM players');
       console.log("Players are: ", rows.map(p => p.name).join(", ")));
    }
    
    getRows();
    

    
    const query = async (sql) => {
        const [err, rows] = await db.all(sql, [])
        return [err, rows];
    }
    

    异步不能在全局范围内

    【讨论】:

    • 这是我试图采取的方向,但永远无法让它发挥作用。不过,这不会在控制台上打印任何内容。
    • 我的错误是因为响应与错误配对,因为这是未定义的 .then 回调中的第一个参数。检查编辑
    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2021-04-10
    • 2019-08-17
    • 1970-01-01
    相关资源
    最近更新 更多