我有一個使用 html 表單、nodejs/express 和 mongodb 的基本 CRUD 應用程式。我一直在通過回呼、promise 和 async/await 了解同步與異步代碼,據我了解,對于一個 crud 應用程式,您希望操作是異步的,以便多個用戶可以同時執行操作。我正在嘗試使用我的快速 crud 操作來實作 aync/await,但不確定它們是同步執行還是異步執行。
這是我的更新功能,它允許用戶輸入他們想要更改的博客的_id,然后輸入博客的新標題和新正文并提交。在當前狀態下,據我所知,它正在同步執行:
app.post('/update', (req, res) => {
const oldValue = { _id: new mongodb.ObjectId(String(req.body.previousValue)) }
const newValues = { $set: { blogTitle: req.body.newValue, blogBody: req.body.newValue2 } }
db.collection("miscData").updateOne(oldValue, newValues, function (err, result) {
if (err) throw err;
console.log("1 document updated");
res.redirect('/')
});
})
我將其更改為異步的方式是這樣的:
app.post('/update', async (req, res) => {
const oldValue = { _id: new mongodb.ObjectId(String(req.body.previousValue)) }
const newValues = { $set: { blogTitle: req.body.newValue, blogBody: req.body.newValue2 } }
await db.collection("miscData").updateOne(oldValue, newValues, function (err, result) {
if (err) throw err;
console.log("1 document updated");
res.redirect('/')
});
})
兩個代碼塊都可以作業,但是我不確定第二個代碼塊是否在做我打算做的事情,即允許用戶在不阻塞呼叫堆疊的情況下更新博客,或者第二個代碼塊是否會僅當我在等待之后運行更多功能時才有意義。這是否達到了預期目的,如果沒有,我怎么能/應該這樣做?
uj5u.com熱心網友回復:
db.collection(...).updateOne始終是異步的,因此您不必擔心長時間運行的資料庫操作可能會阻塞您的應用程式。有兩種方法可以獲得異步結果:
帶有回呼函式
db.collection(...).updateOne(oldValues, newValues, function(err, result) {...});
console.log("This happens synchronously");
帶有兩個引數的回呼函式(err, result)將在資料庫操作完成后(以及在 之后console.log)被異步呼叫。包含err資料庫錯誤訊息或result包含資料庫結果。
帶著承諾
try {
var result = await db.collection(...).updateOne(oldValues, newValues);
// Do something with result
} catch(err) {
// Do something with err
}
console.log("This happens asynchronously");
updateOne沒有回呼函式作為第三個引數的函式回傳一個必須被編輯await的承諾。result在資料庫操作成功完成后,執行某些操作的陳述句將異步執行。如果發生資料庫錯誤,則catch改為執行塊中的陳述句。在任何一種情況下(成功或錯誤),console.log都只會在之后執行。
(如果updateOne沒有雙引數版本,可以寫
var result = await util.promisify(db.collection(...).updateOne)(oldValues, newValues);
使用util.promisify。)
您的第二個代碼段包含兩種方式的混合(第三個引數 plus await),這沒有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461869.html
上一篇:如何將變數設定為輸入的輸出?
