本週,Nodejs v14.3.0 發佈。這個版本包括添加頂級 Await、REPL 加強等功能。javascript
經過自動補全改進對 REPL 的預覽支持,例如,下圖中當輸入 process.ver 以後,不須要輸入剩下的實際內容,它幫咱們生成了自動補全的輸入預覽。html
再也不須要更多的 "async await, async await..." 支持在異步函數以外使用 await 關鍵字。java
在 REPL 環境下作了一個測試,彷佛並無正常工做,獲得了一些錯誤,這是爲何呢?node
根據規範,僅支持在 ES Modules 模塊中可用,參考 tc39/proposal-top-level-awaigit
咱們不能提供 「--input-type=module」 這樣的標誌到 REPL 環境, 這一次在 node 後加上標誌 --experimental-repl-await 看如下示例,如今它能夠正常工做了。github
Nodejs 在版本 v13.2.0 取消了標記 --experimental-module 能夠直接使用 ES Modules。mongodb
一種使用方式是文件後綴名使用 .mjs,另外一種使用方式是還使用原來的 .js 文件,可是要設置 package.json 的 type=module,詳情能夠去官網查看 nodejs.org/api/esm.htm…json
如下示例中咱們使用 setTimeout 模擬了一個 sleep 函數,在指定的延遲時間下打印輸出。api
const sleep = (millisecond, value) => {
return new Promise(resolve => setTimeout(() => resolve(value), millisecond));
};
const val1 = await sleep(1000, 'Output hello after 1 second.');
console.log(val1);
const val2 = await sleep(2000, 'Output Nodejs after 1 second.');
console.log(val2);
複製代碼
直接這樣執行,仍然會獲得一個錯誤,可是看最新發布的 v14.3.0 說明,也沒有說明要提供什麼標誌,這一點產生了困惑。異步
Support for Top-Level Await
It's now possible to use the await keyword outside of async functions.
$ node index.mjs
file:///index.mjs:5
const val1 = await sleep(1000, 'Output hello after 1 second.');
^^^^^
SyntaxError: Unexpected reserved word
複製代碼
在 Github issues Top-level await throws SyntaxError 上發現了一個一樣的問題,解釋了這個緣由,在當前版本 v14.3.0 中運行時咱們仍須要加上以下兩個標誌:
--experimental_top_level_await or --harmony_top_level_await
複製代碼
這一次運行結果是咱們的指望值。
$ node --experimental_top_level_await index.mjs
Output hello after 1 second.
Output Nodejs after 1 second.
複製代碼
上面介紹了 Top-level await 該如何使用,這裏說下它的用途,我的認爲一個比較有用的是咱們能夠在文件的頭部作一些資源的初始化。
建立 initialize-mongo-instance.mjs
下面定義了一個初始化 MongoDB 實例的方法 initializeMongoInstance()
// initialize-mongo-instance.mjs
import mongodb from 'mongodb';
const dbConnectionUrl = 'mongodb+srv://<user>:<password>@cluster0-on1ek.mongodb.net/test?retryWrites=true&w=majority';
const { MongoClient } = mongodb;
export default function initializeMongoInstance (dbName, dbCollectionName) {
return MongoClient.connect(dbConnectionUrl, { useUnifiedTopology: true })
.then(dbInstance => {
const dbObject = dbInstance.db(dbName);
const dbCollection = dbObject.collection(dbCollectionName);
console.log("[MongoDB connection] SUCCESS");
return dbCollection;
}).catch(err => {
console.log(`[MongoDB connection] ERROR: ${err}`);
throw err;
});
}
複製代碼
index.mjs
例如,index.mjs 爲個人啓動文件,在啓動時須要初始化上面定義的 initializeMongoInstance 方法,若是是以前只能寫在一個 async 聲明的異步函數中,如今有了 Top-level await 支持,能夠直接像以下方式來寫:
import initializeMongoInstance from './initialize-mongo-instance.mjs';
const testCollection = await initializeMongoInstance('dbName', 'test');
複製代碼
做者簡介:五月君,Nodejs Developer,慕課網認證做者,熱愛技術、喜歡分享的 90 後青年,歡迎關注Github 開源項目 www.nodejs.red