【问题标题】:the piece of code will not executed in async wait这段代码不会在异步等待中执行
【发布时间】:2022-01-26 07:18:58
【问题描述】:

带有if条件的部分代码不会被执行,父函数会在promise之后执行,但我不明白为什么

let sql = `SELECT *
               FROM ${table}
               WHERE trader = '${trader}'
                 AND pair = '${data.symbol}'`;

    console.log(sql)

    let resp = await new Promise((resolve, reject) => {
        db.all(sql, function (err, rows) {

            console.log("err2")
            console.log(err)
            console.log("rows2")
            console.log(rows)
            return resolve(rows)
        })
    })
    if (resp[0]) { // <------- this will be executed after
        if (data.amount > resp[0].amount) {
            console.log('amount cambiato, comprato')
            // BUY Position
            await updatePosition(data, trader, 'buy');
        }

        if (data.amount < resp[0].amount) {
            console.log('amount cambiato, sellato')
            // BUY Position
            await updatePosition(data, trader, 'sell');
        }
        if (data.amount == resp[0].amount) {
            // BUY Position
            console.log('amount IDENTICO');
            await setCheckedTraderCoin(trader, data.symbol)
        }
    }

为什么会这样?

【问题讨论】:

  • 您忘记添加调用此函数的代码。具体来说,你在父函数中等待这个函数吗?
  • 仅供参考,您包装的 db.all() 函数根本没有错误处理。换句话说,你在默默地忽略错误,并且应该在错误时拒绝承诺。

标签: node.js


【解决方案1】:

这必须在async 函数中,因为您使用的是await。因此,它返回一个承诺。

因此,调用者必须在返回的 Promise 上使用 await.then(),这样它也会等待这里的工作完成。

所有async 函数在函数中的第一个await 上返回它们的承诺。这就是为什么调用者还必须等待该承诺解决 - 否则它会在此函数中的任何异步工作完成之前运行并执行(如您所见)。

因此,调用者在此函数中的异步工作完成之前运行的解决方案是让调用者等待(使用.then()await)返回的promise 在它执行任何进一步操作之前解决。


此外,您需要对包装 db.all() 的 Promise 进行错误处理,以便在出现错误时拒绝该 Promise:

let resp = await new Promise((resolve, reject) => {
    db.all(sql, function (err, rows) {
        if (err) {
            reject(err);
        } else {
            resolve(rows)
        }
    });
});

仅供参考,最好为您的数据库使用直接支持 Promise 的驱动程序,这样您就不必自己手动将每个调用包装在 Promise 中。到目前为止,大多数数据库接口都支持 Promise。有时,您需要不同版本的驱动程序 - 有时它已经在您使用的驱动程序中可用。这取决于您当前使用的数据库/驱动程序。

【讨论】:

  • 哪一个“你的数据库驱动器!?
  • @RogerAI - 你的数据库使用的是哪个 NPM 模块?
  • 我使用 sqlite3 的 sqlite
  • 我不太了解sqlite。你需要找到一个支持 Promise 的版本。我不知道为什么 nodejs 的 sql 数据库似乎是最后一个支持 Promise 的数据库,而大多数其他 DB 都内置了一段时间的 Promise 支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 2018-01-24
  • 1970-01-01
  • 2021-02-16
相关资源
最近更新 更多