Comments 7
(А про await — да, там — ни слова, хотя уже стало актуально.)
Для начала перестаньте использовать for для циклов.Ну вот зачем вы так, сейчас же опять начнется…
Пример с async-функцией лучше написать без await-ов, оставив await-ы на как можно позже в цепочке вызовов — когда результат на самом деле нужен. Разница заключается в том, что если промис не await-ить, то родительская функция не заблокируется, и тем самым несколько промисов будут исполняться параллельно (но не одновременно, конечно же).
Следующий код демонстрирует разницу в два раза во времени выполнения между функцией, где все промисы сразу await-ятся, и между функцией, в которой await откладывается до последнего.
function delay(timeout) {
return new Promise((resolve, reject) => {
setTimeout(resolve, timeout * 1000);
});
}
async function getValueForA() {
await delay(1.0);
return 1000;
}
async function getValueForBFromA(a) {
await delay(1.0);
const b = (await a) / 5;
await delay(1.0);
return b;
}
async function getValueForC() {
await delay(1.0);
return 30;
}
async function getValueForDFromB(b) {
await delay(1.0);
const d = (await b) / 50;
return d;
}
async function calculateTotal(a, b, c, d) {
return (await a) + (await b) + (await c) + (await d);
}
async function doSomethingA() {
const a = await getValueForA();
const b = await getValueForBFromA(a);
const [ c, d ] = await Promise.all([
getValueForC(),
getValueForDFromB(b),
])
const total = await calculateTotal(a, b, c, d);
return total / 1000;
}
async function doSomethingB() {
const a = getValueForA();
const b = getValueForBFromA(a);
const c = getValueForC();
const d = getValueForDFromB(b);
const total = await calculateTotal(a, b, c, d); // только тут!
return total / 1000;
}
async function timeit(times, func) {
const start = process.hrtime();
for (let x = 0; x < times; x++) {
value = await func();
}
const [diff_s, diff_ns] = process.hrtime(start);
return [diff_s * 1000000000 + diff_ns, value];
}
async function main() {
const rep = 1;
const [[At, Av], [Bt, Bv]] = await Promise.all([timeit(rep, doSomethingA), timeit(rep, doSomethingB)]);
console.log(`A: (==${Av}) ${At}`);
console.log(`B: (==${Av}) ${Bt}`);
console.log(`d: ${At/Bt}`);
}
main()
Я хоть и причисляю себя к так ненавидимым "js-хипстерам", но тут советы за гранью зла.
"Не используйте точки с запятой"
someFunction()
//и замыкание
(() => 42)()
^ ПЫЩЩЩ, Uncaught TypeError: someFunction(...) is not a function
Для начала перестаньте использовать for для циклов.
Я думаю имелось ввиду переставать использовать for для простого прохода по массиву. Формулировка автора заслуживает расстрела.
Используйте функциональное программирование и фишки ES
Опять же, к этому каждый должен приходить сам.
Я тут недавно экспериментировал, https://jsperf.com/flatten1, так вот ES6 функция раза в 3 медленнее чем ES5
Ну и в целом советы очень тупые, нельзя в одном тексте скакать от "пишите 2 пробела" до "пишите тесты" и "читайте много технических статей на reddit'е"
Попробуйте заменить var на const
Попробуйте не давать такие советы, а реально объяснять.
Ух, что-то начал цеплятся и автор прям выбесил, пойду ему там в комменты выскажу всё.
Написание современного JavaScript кода