簡體   English   中英

在執行下一行之前,異步不等待 function 完成

[英]Async not awaiting the function to complete before executing next line

我正在使用node-mssql return res.send(result)行在var result = await client(3)之前執行,這不應該是這種情況,因為我在var result = await client(3) await有等待。

調試后,我發現以下代碼不等待 function 完成。

request.bulk(table, (err, result) => {
    if(err){
        return err
    }
    if(result){
        return result
    }
})

這是示例代碼的 rest。

app.get('/', async (req, res) => {
    var result = await client(3)
    return res.send(result)
})

const client = async (client_id) => {
    ...
    const table = new sql.Table('table_name')
    table.create = true
    table.columns.add('a', sql.Int, {nullable: true, primary: true})
    table.columns.add('b', sql.VarChar(50), {nullable: false})
    table.rows.add(777, 'test')

    const request = new sql.Request()
    request.bulk(table, (err, result) => {
        if(err){
            return err
        }
        if(result){
            return result
        }
    })
    ...
}

request.bulk()沒有使用承諾,因此它根本沒有連接到client()返回的內容。 您可以通過手動承諾來解決這個問題:

const client = async (client_id) => {
    ...
    const table = new sql.Table('table_name')
    table.create = true
    table.columns.add('a', sql.Int, {nullable: true, primary: true})
    table.columns.add('b', sql.VarChar(50), {nullable: false})
    table.rows.add(777, 'test')

    const request = new sql.Request()
    const result = await new Promise((resolve, reject) => {
        request.bulk(table, (err, result) => {
            if(err){
                reject(err);
            } else {
                resolve(result);
            }
        });
    });
    ...
    return result;
}

而且,請記住, await僅在您等待 promise 時才有用,該 promise 僅在您完成工作后才解決。 但是,您的client() function 由於async返回 promise 並且 promise 根本沒有連接到request.bulk()完成時。 因此,為了解決這個問題,上面的代碼創建了一個 promise,它與request.bulk()完成並使用await的時間相關聯。 這會導致父async function 返回的 promise 與實際工作完成時相關聯。

僅供參考,如果您的數據庫驅動程序具有內置的原生 promise 支持,那么您可以直接使用它而無需自己承諾。

暫無
暫無

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

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