Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 13.05.2014, 19:16
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от 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);
}

Последний раз редактировалось Octane, 13.05.2014 в 21:10.
Ответить с цитированием
  #22 (permalink)  
Старый 13.05.2014, 21:01
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Кстати, в ES7 возможно будет реализация этого паттерна на уровне языка. Будут введены инструкции async (вместо co, Q.async) и await (вместо yield), и генераторы для это не нужны будут:
Вот это здорово! Как в Coffee Script
__________________
kobezzza
code monkey
Ответить с цитированием
  #23 (permalink)  
Старый 13.05.2014, 21:49
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от kobezzza
Вот это здорово! Как в Coffee Script
nooooooooooooooo
Ответить с цитированием
  #24 (permalink)  
Старый 14.05.2014, 00:07
Аватар для Vantedur
Профессор
Отправить личное сообщение для Vantedur Посмотреть профиль Найти все сообщения от Vantedur
 
Регистрация: 21.04.2011
Сообщений: 429

по мойму проще сервант на кокока завести, кокока куда лучше с js дружет
Ответить с цитированием
  #25 (permalink)  
Старый 14.05.2014, 00:57
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от kobezzza
Вот это здорово! Как в Coffee Script
да что б они провалились !
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #26 (permalink)  
Старый 16.05.2014, 11:02
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

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


Сообщение от Octane
скоро в Nodejs будут доступны встроенные ES6 Promises
Я пока юзаю https://github.com/jakearchibald/ES6-Promises


Сообщение от cyber
да что б они провалились !
Кст, я на CoffeeScript серверный JS пишу. Привык, удобно
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #27 (permalink)  
Старый 16.05.2014, 12:17
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Кст, я на CoffeeScript серверный JS пишу. Привык, удобно
А с IcedCoffeeScript ещё удобнее
__________________
kobezzza
code monkey
Ответить с цитированием
  #28 (permalink)  
Старый 16.05.2014, 19:18
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Tim
Кст, я на CoffeeScript серверный JS пишу. Привык, удобно
Сообщение от kobezzza
А с IcedCoffeeScript ещё удобнее
вы убедили меня написать следующий проект на кофе фронт+бэк
Ответить с цитированием
  #29 (permalink)  
Старый 16.05.2014, 22:43
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от kobezzza
А с IcedCoffeeScript ещё удобнее
Сообщение от melky
вы убедили меня написать следующий проект на кофе фронт+бэк
Очень советую посмотреть в сторону LiveScript
Ответить с цитированием
  #30 (permalink)  
Старый 16.05.2014, 23:33
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
как можно зашифровать ссылку на сервере апече? olehpdatu Серверные языки и технологии 1 22.04.2013 11:51
Недопонимание философии Node.js Voronar AJAX и COMET 10 25.02.2013 14:00
Как сохранять данные на сервере по средствам <form>? goshikvia Общие вопросы Javascript 1 26.03.2009 14:06