簡體   English   中英

異步等待調用 function node.js

[英]async await calling function node.js

我有這個 function,它查詢我的數據庫,然后調用getNumOfSessionForTrainerClientList function:

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

    })
})

然后在 function 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"]因為該變量賦值發生在 function 調用getNumOfSessionForTrainerClientList完成之前。 所以它的發生不同步。 我不確定如何解決這個問題,我之前遇到過async await的問題,但沒有遇到過這樣的問題。 將不勝感激幫助。

For 循環本質上是同步的,因此不會等待您的方法getNumOfSessionForTrainerClientList返回以繼續迭代。

正確的做法是:

  1. 將您的代碼放在異步塊中,並在調用getNumOfSessionForTrainerClientList調用時使用 await() 。
  2. 其次,您的 function getNumOfSessionForTrainerClientList應該返回 promise。

樣本:

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

你的 function 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()

您調用包含異步代碼的 function 因此 getNumOfSessionForTrainerClientList 不依賴於上面的代碼(以(行[i] [“NUM_OF 和控制台”開頭)你應該做的是

  1. 通過返回 prom 使 function 異步

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

    }

    對於 (var i = 0; i < rows.length; i++) { await trainerClientList() rows[i]["NUM_OF_SESSIONS_PER_MONTH"] = (parseInt(rows[i]["NUM_OF_SESSIONS_PER_MONTH"]) - numOfSessionsLeft.numberOfSessionsLeftIs) 控制台。日志(numOfSessionsLeft)}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM