Comments 32
+21
Идея отличная. Вообще, мощь асинхронщины хорошо бы оставлять под капотом, так, чтобы исходный код по-прежнему был линейным.
+3
А не проще ли будет RxJs заюзать?
Функционал стрелочки кроется через flatMap. Плюс еще куча полезных фич.
Функционал стрелочки кроется через flatMap. Плюс еще куча полезных фич.
+2
А чего не 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, которые вроде как в черновиках есть, но не реализованы.
+3
Так вышло, что острой необходимости в моей стрелочке я так и не почувствовал, потому и остальные решения специально не искал.
Да, проблемы важные. Замечу только, что производительность в случаях больших задержек сети не так критична, и можно иногда позволить себе использовать библиотеки и велосипеды.
Да, проблемы важные. Замечу только, что производительность в случаях больших задержек сети не так критична, и можно иногда позволить себе использовать библиотеки и велосипеды.
+1
Идея интересная. А вы смотрели в сторону 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'ов.
+15
Не смотрел. Спасибо!
Честно говоря, я рассматривал ES6 как наше светлое будущее, которое всё ещё не наступило (и ждал arrow functions), а про ES7 не знал. Обязательно обновлю Node.js.
Честно говоря, я рассматривал ES6 как наше светлое будущее, которое всё ещё не наступило (и ждал arrow functions), а про ES7 не знал. Обязательно обновлю Node.js.
+1
es6 уже наступил :)
+1
Собственно, вы можете свою реализацию переделать на использование ключевых слов async и await
0
Посмотрел ECMAScript 6 compatibility table — слишком много там красного для столь оптимистичных заявлений :) Чувствуешь себя первым обладателем телефона в маленьком городке. Вроде радостно, но звонить некому.
Про препроцессор не сразу внимательно прочитал и осознал. По пути нашёл форк Node.js, где всё уже два года как работает (автору — почёт).
Если наличие async/await можно как-то проверить в коде, интересно (в качестве ещё одного домашнего эксперимента) было бы использовать либо их, либо колбеки в зависимости от версии. А если async/await появится везде, можно забыть о стрелочках.
Про препроцессор не сразу внимательно прочитал и осознал. По пути нашёл форк Node.js, где всё уже два года как работает (автору — почёт).
вы можете свою реализацию переделать на использование ключевых слов async и await
Если наличие async/await можно как-то проверить в коде, интересно (в качестве ещё одного домашнего эксперимента) было бы использовать либо их, либо колбеки в зависимости от версии. А если async/await появится везде, можно забыть о стрелочках.
0
Регуляркой проверить наличие await/async в коде будет гораздо проще, чем проверить многи другие конструкции языка.
Я имел в виду проверку поддержки async/await в используемой версии языка, какими-то конструкциями в коде. Извините, если запутал.
0
del
0
В nodejs так нельзя сейчас.
0
Имхо, лучше подключить нормальную библиотеку или препроцессор, чем делать это на коленке.
-1
Iced CoffeeScript вам в помощь.
0
Можно использовать генераторы из 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);
})()
+4
UFO just landed and posted this here
UFO just landed and posted this here
Да, Вы правы. Я должен был упомянуть об этом, но забыл.
С использованием нормального парсера можно учесть не только работу с исключениями, о которой я упомянул, но и конструкции for/while/другое. И аккуратно реализовать два сценария «return» — выход из функции и выход из функции с вызовом колбека.
С использованием нормального парсера можно учесть не только работу с исключениями, о которой я упомянул, но и конструкции for/while/другое. И аккуратно реализовать два сценария «return» — выход из функции и выход из функции с вызовом колбека.
+2
По поводу arrow function то в версии Chrome Canary уже давно можно писать в такой нотации, а кому интересно следить за развитием нововведений может посмотреть тут www.chromestatus.com/features/5047308127305728. Очень жду этого в NodeJS, после C# этих стрелок ой как не хватает.
0
Также если кому интересно подобный подход используется в C# github.com/yortus/asyncawait
0
Вы заново изобрели backcall из Livescript )
0
Sign up to leave a comment.
Асинхронный JavaScript: без колбеков и промисов