[英]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.