【问题标题】:async await calling function node.js异步等待调用函数 node.js
【发布时间】:2022-02-11 15:01:33
【问题描述】:

我有这个函数,它查询我的数据库,然后调用getNumOfSessionForTrainerClientList 函数:

var select = "select * from USERS WHERE ASSIGNED_TRAINER = ?"
mysqlconn.connect(function(err) {
    if (err) {
        console.error('Database connection failed: ' + err.stack);
        return;
    }

    mysqlconn.query(select, [req.session.username], async function(err, rows) {
        if (err) {
            console.log(err);
        } else {
            
            let numOfSessionsLeft = {
                numberOfSessionsLeftIs: 0
            }
            for (var i = 0; i < rows.length; i++) {
                getNumOfSessionForTrainerClientList(req, res, rows[i], numOfSessionsLeft)
                rows[i]["NUM_OF_SESSIONS_PER_MONTH"] = (parseInt(rows[i]["NUM_OF_SESSIONS_PER_MONTH"]) - numOfSessionsLeft.numberOfSessionsLeftIs)
                console.log(numOfSessionsLeft)
            }
          

        }
        mysqlconn.end();

    })
})

然后在函数getNumOfSessionForTrainerClientList里面,我有这个:

async function getNumOfSessionForTrainerClientList(req, res, rows, numOfSessionsLeft) {

var getNumOfSessionForTrainerClientList = "select * from SCHEDULE WHERE CLIENT_USERNAME = ? AND ASSIGNED_TRAINER = ?"
mysqlconn.connect(async function(err) {
    if (err) {
        console.error('Database connection failed: ' + err.stack);
        return;
    }
        mysqlconn.query(getNumOfSessionForTrainerClientList, [rows["USERNAME"], req.session.username], async function(err, sessionData) {
            if (err) {
                console.log(err);
            } else {
                numOfSessionsLeft.numberOfSessionsLeftIs = 1;
                console.log(numOfSessionsLeft.numberOfSessionsLeftIs)

            }

        })

})

}

然而,发生的事情是这一行:rows[i]["NUM_OF_SESSIONS_PER_MONTH"] = (parseInt(rows[i]["NUM_OF_SESSIONS_PER_MONTH"]) - numOfSessionsLeft.numberOfSessionsLeftIs) 实际上将0 分配给rows[i]["NUM_OF_SESSIONS_PER_MONTH"],因为该变量分配发生在对getNumOfSessionForTrainerClientList 的函数调用完成之前。所以它发生的不同步。我不知道如何解决这个问题,我之前遇到过async await 的问题,但没有这样的问题。将不胜感激。

【问题讨论】:

标签: javascript mysql node.js asynchronous async-await


【解决方案1】:

For 循环本质上是同步的,因此不会等待您的方法 getNumOfSessionForTrainerClientList 返回以继续迭代。

正确的做法是:

  1. 将您的代码放在异步块中,并在调用 getNumOfSessionForTrainerClientList 调用时使用 await()。
  2. 其次,你的函数getNumOfSessionForTrainerClientList应该 返回一个承诺。

示例:

async function functionA() {
    var select = "select * from USERS WHERE ASSIGNED_TRAINER = ?"
    mysqlconn.connect(function(err) {
        if (err) {
            console.error('Database connection failed: ' + err.stack);
            return;
        }
    
        mysqlconn.query(select, [req.session.username], async function(err, rows) {
            if (err) {
                console.log(err);
            } else {
                
                let numOfSessionsLeft = {
                    numberOfSessionsLeftIs: 0
                }
                for (var i = 0; i < rows.length; i++) {
                    await getNumOfSessionForTrainerClientList(req, res, rows[i], numOfSessionsLeft)
                    rows[i]["NUM_OF_SESSIONS_PER_MONTH"] = (parseInt(rows[i]["NUM_OF_SESSIONS_PER_MONTH"]) - numOfSessionsLeft.numberOfSessionsLeftIs)
                    console.log(numOfSessionsLeft)
                }
            }
            mysqlconn.end();
        })
    })
}

您的函数 getNumOfSessionForTrainerClientList 应该如下所示:

async function getNumOfSessionForTrainerClientList(req, res, rows, numOfSessionsLeft) {

    return new Promise((resolve, reject) => {

        var getNumOfSessionForTrainerClientList = "select * from SCHEDULE WHERE CLIENT_USERNAME = ? AND ASSIGNED_TRAINER = ?"
        mysqlconn.connect(async function(err) {
            if (err) {
                console.error('Database connection failed: ' + err.stack);
                return reject(err);
            }
                mysqlconn.query(getNumOfSessionForTrainerClientList, [rows["USERNAME"], req.session.username], async function(err, sessionData) {
                    if (err) {
                        console.log(err);
                        return reject(err);
                    } else {
                        numOfSessionsLeft.numberOfSessionsLeftIs = 1;
                        console.log(numOfSessionsLeft.numberOfSessionsLeftIs)
                        return resolve();

                    }
                })

        })
    })

}

然后使用您需要的任何参数调用functionA()

【讨论】:

    【解决方案2】:

    您调用包含异步代码的函数,因此 getNumOfSessionForTrainerClientList 不依赖于上述代码(以 (rows[i]["NUM_OF and console) 开头)您应该做的是

    1. 通过返回 prom 使函数异步

    2. 使用 await 关键字执行它

      async function trainerClientList(){
      
      return new Promise((resolve,reject)=>{
      
                  var getNumOfSessionForTrainerClientList = "select * from SCHEDULE WHERE CLIENT_USERNAME = ? AND ASSIGNED_TRAINER = ?"
          mysqlconn.connect(async function(err) {
              if (err) {
                  console.error('Database connection failed: ' + err.stack);
                  resolve()
              }
                  mysqlconn.query(getNumOfSessionForTrainerClientList, [rows["USERNAME"], req.session.username], async function(err, sessionData) {
                      if (err) {
                          console.log(err);
                      } else {
                          numOfSessionsLeft.numberOfSessionsLeftIs = 1;
                          console.log(numOfSessionsLeft.numberOfSessionsLeftIs)
      
                      }
      
                  })
      
          })
      
          resolve()
      
      
      })
      

      }

      for (var i = 0; i

    【讨论】:

    • 感谢您的回答。不幸的是,它似乎没有用。它为我提供了相同的结果
    猜你喜欢
    • 2020-08-01
    • 2020-04-09
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多