Pull to refresh

Comments 7

Большинство (если не все) советов — ерунда. :)
Как-то оно у вас бедно написано, если в 2 словах — это «используйте await и функциональщину». Здесь https://habrahabr.ru/post/312022/ всё гораздо подробнее и полнее.
(А про 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

Попробуйте не давать такие советы, а реально объяснять.


Ух, что-то начал цеплятся и автор прям выбесил, пойду ему там в комменты выскажу всё.

Главный вопрос, что выбрать AirBnB Style или Standard Style?
Sign up to leave a comment.

Articles