Комментарии 32
Идея отличная. Вообще, мощь асинхронщины хорошо бы оставлять под капотом, так, чтобы исходный код по-прежнему был линейным.
А не проще ли будет RxJs заюзать?
Функционал стрелочки кроется через flatMap. Плюс еще куча полезных фич.
Функционал стрелочки кроется через flatMap. Плюс еще куча полезных фич.
А чего не streamline.js?
А вообще, с такими конвертерами всё равно не решаются важные проблемы:
1. Проблема с производительностью. Наматывать контексты замыканий на коллбэки, а потом разматывать — это гораздо дольше, чем нативные call/ret. Плюс оптимизатор v8 умеет такие оптимизации, как global value numbering, loop invariant motion. А они работают, если граф потока управления един, а не разбит по 100 колбэкам.
2. Проблема с отладкой.
3. Нарушение контрактов в ряде случаев. Например, event bubbling переходит к следующим элементам сразу по возвращении из listener'ов. А если listener написан с помощью streamline.js, то нужны специальные ухищрения.
По мне, так не выпендривались бы вендоры, а давно внедрили бы кучу хороших синхронных API в webworkers, которые вроде как в черновиках есть, но не реализованы.
А вообще, с такими конвертерами всё равно не решаются важные проблемы:
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 можно писать так:
подключив соответствующий препроцессор этот код будет на лету преобразован в es6 код с использованием нативных генераторов и Promise'ов.
Например, сейчас в 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.
Честно говоря, я рассматривал ES6 как наше светлое будущее, которое всё ещё не наступило (и ждал arrow functions), а про ES7 не знал. Обязательно обновлю Node.js.
es6 уже наступил :)
Собственно, вы можете свою реализацию переделать на использование ключевых слов async и await
Посмотрел ECMAScript 6 compatibility table — слишком много там красного для столь оптимистичных заявлений :) Чувствуешь себя первым обладателем телефона в маленьком городке. Вроде радостно, но звонить некому.
Про препроцессор не сразу внимательно прочитал и осознал. По пути нашёл форк Node.js, где всё уже два года как работает (автору — почёт).
Если наличие async/await можно как-то проверить в коде, интересно (в качестве ещё одного домашнего эксперимента) было бы использовать либо их, либо колбеки в зависимости от версии. А если async/await появится везде, можно забыть о стрелочках.
Про препроцессор не сразу внимательно прочитал и осознал. По пути нашёл форк Node.js, где всё уже два года как работает (автору — почёт).
вы можете свою реализацию переделать на использование ключевых слов async и await
Если наличие async/await можно как-то проверить в коде, интересно (в качестве ещё одного домашнего эксперимента) было бы использовать либо их, либо колбеки в зависимости от версии. А если async/await появится везде, можно забыть о стрелочках.
Регуляркой проверить наличие await/async в коде будет гораздо проще, чем проверить многи другие конструкции языка.
Я имел в виду проверку поддержки async/await в используемой версии языка, какими-то конструкциями в коде. Извините, если запутал.
del
В nodejs так нельзя сейчас.
Имхо, лучше подключить нормальную библиотеку или препроцессор, чем делать это на коленке.
Iced CoffeeScript вам в помощь.
Можно использовать генераторы из ES6 (есть в Chrome, FF и node.js).
Вот например с использованием co
Вот например с использованием 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);
})()
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
По поводу arrow function то в версии Chrome Canary уже давно можно писать в такой нотации, а кому интересно следить за развитием нововведений может посмотреть тут www.chromestatus.com/features/5047308127305728. Очень жду этого в NodeJS, после C# этих стрелок ой как не хватает.
Также если кому интересно подобный подход используется в C# github.com/yortus/asyncawait
Вы заново изобрели backcall из Livescript )
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Асинхронный JavaScript: без колбеков и промисов