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”