Čekání na nejvyšší úrovni je k dispozici v modulech Node.js

Node.js je krásný nástroj pro psaní rychlých skriptů. Používám ho v mnoha mých procesech sestavení. Přejmenování souborů, stahování dat, zpracování obrázků – skripty Node.js zvládají mnoho úkolů v mých projektech.

Vyskytla se však jedna malá nepříjemnost. Při práci s asynchronními funkcemi, jako je vytváření síťových požadavků, nebyla v Node.js (zatím) žádná čekací podpora nejvyšší úrovně .

await klíčové slovo vám umožní rozmotat kód založený na slibech, vyhnout se řetězení then volání a učinit zdrojový kód čitelnějším.

// promise-based code
Promise.resolve('hello world').then((asyncMsg) => {
  console.log(msg);
});

// async/await code
const asyncMsg = await Promise.resolve('hello world');
console.log(msg);

Bohužel jste nemohli použít await klíčové slovo bez zabalení do async funkce.

// use an async IIFE
(async () => {
  const asyncMsg = Promise.resolve('hello world');
  console.log(asyncMsg);
})();

// use an async main function
async function main() {
  const asyncMsg = Promise.resolve('hello world');
  console.log(asyncMsg);
}

main();

A při zabalování kódu do async function není strašné, jeho účelem je povolit await klíčové slovo. Existuje lepší způsob? Můžeme se těmto async vyhnout obálky v kódu Node.js? Čekání na nejvyšší úrovni nyní přichází na pomoc!

nejvyšší úroveň await je k dispozici „bez příznaku“ v Node.js od v14.8

Počínaje Node.js v14.8 , je k dispozici čekání na nejvyšší úrovni (bez použití --harmony-top-level-await příznak příkazového řádku).

Má to jeden háček:čekání na nejvyšší úrovni je k dispozici pouze v modulech ES. Existují tři způsoby, jak vytvořit ze skriptu Node.js modul EcmaScript.

Uvědomte si, že pokud povolujete moduly ES v Node.js, musíte změnit všechny require a module příkazy s jejich import a export protějšky.

Použijte mjs přípona souboru

Použijte .mjs příponu souboru a nazvěte to den! 🎉

// File: index.mjs
//
// Command line usage: node index.mjs

const asyncMsg = await Promise.resolve('WORKS!');
console.log(asyncMsg); // "WORKS!"

Udělejte z celého balíčku modul

Pokud vyvíjíte balíček, můžete také definovat type vlastnost ve vašem package.json prohlásit, že je založen na modulech ECMAscript.

// File: index.js
//       (near package.json including { "type": "module" })
//
// Command line usage: node index.js

const asyncMsg = await Promise.resolve('WORKS!');
console.log(asyncMsg); // "WORKS!"

Definujte input-type při vyhodnocování vstupu řetězce

Někdy může být nutné vložit kód do binárního souboru Node.js nebo použít eval vlajka. Použijte input-type příznak určující, že předaná řetězcová hodnota je modul ECMAscript.

node --input-type=module \ 
  --eval="const asyncMsg = await Promise.resolve('WORKS!'); console.log(asyncMsg);"

Čekat, čekat, čekat...

Je krásné, že čekatel nejvyšší úrovně konečně vstoupil do Node.js! Asi zůstanu u .mjs příponu souboru, abych ji mohl použít v mých skriptech. Přejmenování souboru skriptu z js na mjs je rychle hotovo a nezavádí významné změny.

Pokud se vám tyto rychlé tipy líbí, podívejte se na můj týdenní zpravodaj. 👇