V8 выпущен 6.3 25 октября 2017 года (см. Он включает новые функции от ECMAMSCRIPT STEPAS-3 Кажется вероятным, что они также скоро будут реализованы в node.js
Теперь вы можете попробовать их с --хамония
варианты или сторонние библиотеки. Я разработал демонстрацию на GitHub
Технические характеристики
Можно динамически загружать части приложения JavaScript во время выполнения с этой функцией. Если вы хотите использовать функцию из Modulea или ModuleB, вы можете написать код, как ниже.
if (member.isLoggedIn()) { moduleA.func(); } else { moduleB.func(); }
Используя статический импорт, вы должны импортировать оба модуля.
import moduleA from './moduleA'; import moduleB from './moduleB'; if (member.isLoggedIn()) { moduleA.func(); } else { moduleB.func(); }
Тем не менее, теперь вы можете динамически импортировать только тот модуль, который вы хотите использовать с функцией динамического импорта.
if (member.isLoggedIn()) { import('./moduleA.js') // load moduleA here .then(module => { module.func(); }); } else { import('./moduleB.js') // load moduleB here .then(module => { module.func(); }); }
Кроме того, вы можете использовать динамический импорт с циклом или обещанием.
for (let i = 0; i < MAX; i++) { import(`module${i}.js`) .then(module => { module.func(); }); }
promiseFunc() .then(res => { return import('./module.js'); }) .then(module => { module.func(data); });
Function import () возвращает объект Promise, и вы можете использовать Async/ждать.
(async() => { if (member.isLoggedIn()) { const module = await import('./moduleA.js') // load moduleA module.func(); } else { const module = await import('./moduleB.js') // load moduleB module.func(); } })()
Демо С Chrome 63 или более поздней версии проверьте консоль или сетевую панель, и вы можете увидеть модули, загруженные динамически во время выполнения. Код ниже.
(async() => { let count = 0; // load hello1、hello2、hello3 in a random order at runtime let id = setInterval(async() => { const i = Math.floor(Math.random() * 3) + 1; const module = await import(`./import_modules/hello${i}.js`); module.hello(); count++; if (count === 10) { clearInterval(id); } }, 1000); })();
Используя Узел-модуле-модульный погрузчик , он доступен для запуска в node.js.
Технические характеристики
a.k.a асинхронные итераторы/генераторы Это поддерживает асинхронно итерационные данные из асинхронных функций. Если вы не знаете итератор и генератор, прочитайте это
До сих пор можно было запустить асинхронные функции или API параллельно с обещанием. Все.
(async() => { const dataList = await Promise.all([ fetch('https://qiita.com/api/v2/tags/Node.js'), fetch('https://qiita.com/api/v2/tags/JavaScript'), fetch('https://qiita.com/api/v2/tags/npm'), ]); for (const data of dataList) { console.log(data); } })();
Тем не менее, вызов многих функций или API может сделать код слишком громоздким. Асинхронные итераторы позволяют прочитать его.
(async() => { const promises = []; for (const tag of ["Node.js", "JavaScript", "npm"]) { promises.push(fetch(`https://qiita.com/api/v2/tags/${tag}`)); } for await (const data of promises) { console.log(data) } })();
Асинхронные генераторы позволяют настроить итерацию. Демо С Chrome 63 или более поздней версии проверьте консоль или сетевую панель, и вы можете увидеть API несколько раз. Код ниже. Используя Axios Анкет
/* * get random number */ async function* gen() { while (true) { const res = await axios.get('https://www.random.org/decimal-fractions/?num=1&dec=10&col=1&format=plain&rnd=new'); const num = res.data; yield Number(num); } } (async() => { const BREAK = 0.8; for await (const num of gen()) { console.log(num); if (num > BREAK) { console.log("over", BREAK); break; } } })();
В node.js необходимо использовать -harmony_async_iteration
вариант.
Технические характеристики
Как вы знаете, это, наконец, Fry-Catch-Finally. До сих пор, если вы хотите выполнить какой -то код независимо от того, произойдет ли ошибка или нет, вам пришлось написать указанный код как в блоках Then (), так и в Catch () от обещания.
promiseFunc() .then(() => { someFunction(); closeFunction(); // for successful }) .catch(err => { console.log(err); closeFunction(); // for error });
Тем не менее, теперь обещание.prototype.Finally позволяет писать код, как и образец, финально.
promiseFunc() .then(() => { someFunction(); }) .catch(err => { console.log(err); }) .finally(() => { closeFunction(); });
Теперь вы можете использовать Try-Catch-Finally с помощью Async/a ждать шаблона.
(async() => { try { await promiseFunc(); await someFunction(); } catch (err) { console.log(err); } finally { closeFunction(); } })();
Демо Код ниже.
Promise.resolve("resolve") .then(val => {console.log(val);return "then"}) .then(val => {console.log(val);throw new Error("catch")}) .catch(err => {console.log(err.message)}) .finally(() => {console.log("finally")});
С Chrome 63 или более поздней версии, проверьте панель консоли, и вы можете увидеть Resolve (), Then (), Catch () и, наконец, () вызываются.
В node.js необходимо использовать -harmony_promise_finally
вариант.
- V8 javaScript Engine: V8 Release 6.3
- TC39/предложение-динамик-импорт
- TC39/Предложение-Async-Iteration
- TC39/предложение-промо-финально
- Асинхронные итераторы и генераторы – jakearchibald.com
- Обещание.prototype.finally | blog.jxck.io
@shimataro999 и @mackles93 просмотрел этот пост.
Спасибо.
Оригинал: “https://dev.to/shisama/v8-63-shipped-new-ecmascript-features-e3j”