Комментарии 32
Осталось только обнаружить внутренние разногласия и получается имплементация промисов как монад в жс с синтаксисом хаскела.
Идея отличная. Вообще, мощь асинхронщины хорошо бы оставлять под капотом, так, чтобы исходный код по-прежнему был линейным.
А не проще ли будет RxJs заюзать?
Функционал стрелочки кроется через flatMap. Плюс еще куча полезных фич.
Я только лишь смотрел видео с увлекательным выступлением Александра Соловьёва «Functional Reactive Programming & ClojureScript». Очень порадовался реактивному программированию, но более ничего в этой области не изучал. Надо только придумать себе задачу и наконец попробовать.
А чего не streamline.js?

А вообще, с такими конвертерами всё равно не решаются важные проблемы:

1. Проблема с производительностью. Наматывать контексты замыканий на коллбэки, а потом разматывать — это гораздо дольше, чем нативные call/ret. Плюс оптимизатор v8 умеет такие оптимизации, как global value numbering, loop invariant motion. А они работают, если граф потока управления един, а не разбит по 100 колбэкам.
2. Проблема с отладкой.
3. Нарушение контрактов в ряде случаев. Например, event bubbling переходит к следующим элементам сразу по возвращении из listener'ов. А если listener написан с помощью streamline.js, то нужны специальные ухищрения.

По мне, так не выпендривались бы вендоры, а давно внедрили бы кучу хороших синхронных API в webworkers, которые вроде как в черновиках есть, но не реализованы.
Так вышло, что острой необходимости в моей стрелочке я так и не почувствовал, потому и остальные решения специально не искал.
Да, проблемы важные. Замечу только, что производительность в случаях больших задержек сети не так критична, и можно иногда позволить себе использовать библиотеки и велосипеды.
Идея интересная. А вы смотрели в сторону async и await из es7?
Например, сейчас в node.js можно писать так:
async function loadStory() {
  try {
    let story = await getJSON('story.json');
    addHtmlToPage(story.heading);
    addTextToPage("All done");
  } catch (err) {
    addTextToPage("Argh, broken: " + err.message);
  }
}

(async function() {
  await loadStory();
  console.log("Yey, story successfully loaded!");
}());

подключив соответствующий препроцессор этот код будет на лету преобразован в es6 код с использованием нативных генераторов и Promise'ов.
Не смотрел. Спасибо!
Честно говоря, я рассматривал ES6 как наше светлое будущее, которое всё ещё не наступило (и ждал arrow functions), а про ES7 не знал. Обязательно обновлю Node.js.
Собственно, вы можете свою реализацию переделать на использование ключевых слов async и await
Посмотрел ECMAScript 6 compatibility table — слишком много там красного для столь оптимистичных заявлений :) Чувствуешь себя первым обладателем телефона в маленьком городке. Вроде радостно, но звонить некому.
Про препроцессор не сразу внимательно прочитал и осознал. По пути нашёл форк Node.js, где всё уже два года как работает (автору — почёт).

вы можете свою реализацию переделать на использование ключевых слов async и await

Если наличие async/await можно как-то проверить в коде, интересно (в качестве ещё одного домашнего эксперимента) было бы использовать либо их, либо колбеки в зависимости от версии. А если async/await появится везде, можно забыть о стрелочках.
Регуляркой проверить наличие await/async в коде будет гораздо проще, чем проверить многи другие конструкции языка. Тем более, что async всегда идёт перед function, а await перед CallExpression. Ну или воспользоваться esprima (найти только ветку или форк, который поддерживает await/async).
Регуляркой проверить наличие await/async в коде будет гораздо проще, чем проверить многи другие конструкции языка.

Я имел в виду проверку поддержки async/await в используемой версии языка, какими-то конструкциями в коде. Извините, если запутал.
var asyncSupported = false;
try {
  asyncSupported = typeof (new Function('return async function(){ }')) === 'function'
}
catch(e){}
Имхо, лучше подключить нормальную библиотеку или препроцессор, чем делать это на коленке.
Можно использовать генераторы из ES6 (есть в Chrome, FF и node.js).

Вот например с использованием co

co(function *(){
  var a = yield get('http://google.com');
  var b = yield get('http://yahoo.com');
  var c = yield get('http://cloudup.com');
  console.log(a[0].statusCode);
  console.log(b[0].statusCode);
  console.log(c[0].statusCode);
})()
Прошу заметить, что в Node.js не мажорной версии, а unstable. 0.12 стабильная версия в которой появятся генераторы, стоит ждать минимум в конце года.
не пугайте народ. Они спокойно traceur-ом компилируются в ie9+. А нативно только в фф. Ноды 0.12 не было же вроде пока?
Скажем так: ноды 0.12 ещё не было пока, но с 7 августа началась работа над Node.js v0.13; следовательно, как только в v0.11 окончится остаточная ловля багов и недоделок, так сразу и v0.12 выйдет. Неизбежность.
Получается, что использовать стрелку можно только на самом верхнем уровне функции, а, например, внутри if или for уже не выйдет.
Да, Вы правы. Я должен был упомянуть об этом, но забыл.
С использованием нормального парсера можно учесть не только работу с исключениями, о которой я упомянул, но и конструкции for/while/другое. И аккуратно реализовать два сценария «return» — выход из функции и выход из функции с вызовом колбека.
По поводу arrow function то в версии Chrome Canary уже давно можно писать в такой нотации, а кому интересно следить за развитием нововведений может посмотреть тут www.chromestatus.com/features/5047308127305728. Очень жду этого в NodeJS, после C# этих стрелок ой как не хватает.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.