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
, 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
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
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
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. 👇