我有三個功能
async function inventories() {
print("starting inventories")
sleepFor(5000)
// Here I am querying a mongodb database
const inventoriesRes = await db.inventories.find({})
return inventoriesRes
}
async function costs() {
print("starting costs")
const costsRes = await db.costs.find({})
return costsRes
}
async function users() {
print("starting users")
const users = await db.users.find({})
return usersRes
}
我想 :
- 要在 // 中執行的所有查詢
- 全部完成后,列印結果
這是我的解決方案
const dbqueries = async () => {
const [result1, result2, result3] = await Promise.all([inventories(), costs(), users()])
return {result1, result2, result3}
}
dbqueries.then(results => {
print(JSON.stringify(results))
}).catch(error => {
throw error
});
問題是我不是這個解決方案按我的意愿作業。為了驗證,我在inventories()
函式中設定了一個睡眠(見下面的代碼)。正在發生的事情是
printing starting inventories
waiting for 5 seconds
printing costs
printing users
這讓我認為 cost() 并不是同時開始的。如果早點開始,我會
printing starting inventories
printing costs
printing users
...
function sleepFor(sleepDuration){
var now = new Date().getTime();
while(new Date().getTime() < now sleepDuration){
/* Do nothing */
}
}
要么我的解決方案是錯誤的,要么sleepFor
函式所做的不僅僅是讓inventories()
函式進入睡眠狀態。有什么幫助嗎?
PS。print
與 mongoshell完全一樣console.log()
,它是一個功能齊全的 JS 解釋器
uj5u.com熱心網友回復:
…或者
sleepFor
函式正在做的不僅僅是讓inventories()
函式進入睡眠狀態
正是如此。您撰寫了一個同步的阻塞睡眠函式,它會停止整個程式。您已經await
在函式中的任何函式之前呼叫了它,因此在并發作業已經在進行時它甚至不會在稍后休眠,您在inventories()
回傳它的承諾之前就休眠了,并且可以呼叫其他兩個函式。
您的原始程式確實按預期作業。為了驗證,您應該print
在每個資料庫呼叫完成時添加另一個陳述句來記錄:
async function inventories() {
print("starting inventories")
// Here I am querying a mongodb database
const inventoriesRes = await db.inventories.find({})
print("finished inventories")
return inventoriesRes
}
請記住,JS 代碼不會在多個執行緒或任何東西上并行運行。您所能做的就是啟動多個異步任務(在您的情況下是資料庫查詢),而無需立即等待每個任務完成。相反,您啟動它們,然后在它們同時作業時等待結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498342.html
標籤:javascript 异步 异步等待 承诺