我對 JavaScript Web 開發人員有點陌生,所以我仍在了解異步函式的流程,這對于不熟悉的人來說可能有點出乎意料。在我的特定用例中,我想在進入主代碼之前在可用資料庫串列上執行一個例程。具體來說,為了確保測驗環境始終正確初始化,如果資料庫已經存在,我將洗掉它,然后從組態檔構建它。
我的基本流程如下所示:
let dbAdmin = client.db("admin").admin();
dbAdmin.listDatabases(function(err, dbs){/*Loop through DBs and drop relevant one if present.*/});
return await buildRelevantDB();
通過console.log()在整個程序中添加一些專案,我確定該listDatabases()呼叫基本上將回呼放入各種佇列中。我實際上是buildRelevantDB() 在進入傳遞給listDatabases 的回呼之前進入的。在這個特定的例子中,它似乎無論如何都可以作業,我認為因為讀取組態檔的呼叫也是異步的,因此將專案放入同一個佇列但稍后,但我發現這很脆弱和草率。必須有某種方法來確保該listDatabases部分在繼續之前解決。
我找到的最接近的解決方案是here,但我仍然不知道如何讓我傳遞給 listDatabases 的回呼then與該解決方案中的一樣。
uj5u.com熱心網友回復:
混合回呼和承諾是一種更高級的技術,所以如果你是 JavaScript 的新手,盡量避免它。事實上,即使你已經學會了一切并成為了一個 js 忍者,也要盡量避免它。
listDatabases 的檔案說它是異步的,所以你可以等待它而不會弄亂回呼:
const dbs = await dbAdmin.listDatabases();
/*Loop through DBs and drop relevant one if present.*/
接下來的事情,就不用await之前了return。如果你可以await在一個函式中,它是async并回傳一個承諾,所以只需從 buildRelevantDB 回傳承諾:
return buildRelevantDB();
最后,您可以直接洗掉資料庫。無需遍歷所有資料庫即可選擇要洗掉的資料庫:
await client.db(<db name to drop>).dropDatabase();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/404453.html
標籤:
