Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как вы пишете на сервере (node.js) (https://javascript.ru/forum/offtopic/47170-kak-vy-pishete-na-servere-node-js.html)

Octane 13.05.2014 19:16

Цитата:

Сообщение от melky
да, я сейчас хотел написать функцию факториала на co.. в общем, мне нужна подготовка)

Все эти co и Q.async на самом деле ничего сложного не делают, а просто автоматически выстраивают такую штуку:
gen.next().value.then(function (value1) {
    gen.next(value1).value.then(function (value2) {
        gen.next(value2).value.then(function (value3) {
            gen.next(value3)...
        });
    })
});


Вот рабочий пример для понимания:
function asyncGet1(value) {
    return new Promise(function (resolve) {
        setImmediate(resolve, value);
    });
}

function asyncGet2(value) {
    return new Promise(function (resolve) {
        setImmediate(resolve, value + 1);
    });
}

function asyncGet3(value) {
    return new Promise(function (resolve) {
        setImmediate(resolve, value * 2);
    });
}

function * genFunc() {

    var x = yield asyncGet1(1);
    console.log('x = ' + x); // x = 1

    var y = yield asyncGet2(x);
    console.log('y = ' + y); // y = 2

    var z = yield asyncGet3(y);
    console.log('z = ' + z); // z = 4

}

//вместо co или Q.async:
var gen = genFunc();

gen.next().value.then(function (x) {
    gen.next(x).value.then(function (y) {
        gen.next(y).value.then(function (z) {
            gen.next(z);
        });
    })
});
yield никакой асинхронностью не занимается, он просто останавливает выполнение генератора до следующего вызова next.

Когда пишешь генератор, можно представлять, что co в паре с yield разбивают genFunc на вот такие «подфункции»:
function next1() {
    asyncGet1(1).then(next2);
}

function next2(value) {
    x = value;
    asyncGet2(x).then(next3);
}

function next3(value) {
    y = value;
    asyncGet3(y).then(next4);
}

function next4(value) {
    z = value;
}
Здесь специально расписал через value, чтобы воспринималось, как promise value.



Кстати, в ES7 возможно будет реализация этого паттерна на уровне языка. Будут введены инструкции async (вместо co, Q.async) и await (вместо yield), и генераторы для это не нужны будут:
async function func() {
    var x = await asyncGet1(1);
    var y = await asyncGet2(x);
    var z = await asyncGet3(y);
}

kobezzza 13.05.2014 21:01

Цитата:

Кстати, в ES7 возможно будет реализация этого паттерна на уровне языка. Будут введены инструкции async (вместо co, Q.async) и await (вместо yield), и генераторы для это не нужны будут:
Вот это здорово! Как в Coffee Script :)

melky 13.05.2014 21:49

Цитата:

Сообщение от kobezzza
Вот это здорово! Как в Coffee Script

nooooooooooooooo

Vantedur 14.05.2014 00:07

по мойму проще сервант на кокока завести, кокока куда лучше с js дружет

cyber 14.05.2014 00:57

Цитата:

Сообщение от kobezzza
Вот это здорово! Как в Coffee Script

да что б они провалились !

Tim 16.05.2014 11:02

Цитата:

Сообщение от kobezzza
1) Не бросай исключений в асинхронных операциях, а передавай их как параметр callback;

Поддержу, мне тоже так удобнее.


Цитата:

Сообщение от Octane
скоро в Nodejs будут доступны встроенные ES6 Promises

Я пока юзаю https://github.com/jakearchibald/ES6-Promises


Цитата:

Сообщение от cyber
да что б они провалились !

Кст, я на CoffeeScript серверный JS пишу. Привык, удобно :)

kobezzza 16.05.2014 12:17

Цитата:

Кст, я на CoffeeScript серверный JS пишу. Привык, удобно
А с IcedCoffeeScript ещё удобнее :)

melky 16.05.2014 19:18

Цитата:

Сообщение от Tim
Кст, я на CoffeeScript серверный JS пишу. Привык, удобно

Цитата:

Сообщение от kobezzza
А с IcedCoffeeScript ещё удобнее

вы убедили меня написать следующий проект на кофе :) фронт+бэк

monolithed 16.05.2014 22:43

Цитата:

Сообщение от kobezzza
А с IcedCoffeeScript ещё удобнее

Цитата:

Сообщение от melky
вы убедили меня написать следующий проект на кофе фронт+бэк

Очень советую посмотреть в сторону LiveScript

melky 16.05.2014 23:33

Цитата:

Сообщение от monolithed
Очень советую посмотреть в сторону LiveScript

хорошее предложение)
давненько хотел начать писать в функциональном стиле на JS
в последний раз видел LiveScript, когда он только появился.
он сейчас готов к продакшену? трудно ли начать писать на нём? выглядит страшновато


Часовой пояс GMT +3, время: 23:47.