Цитата:
|
kobezzza,
чот как-то они тянут) |
|
Кстати, в io.js всё таки добавят воркеры)
https://github.com/iojs/io.js/pull/1159 |
Цитата:
|
Цитата:
Т.е. чтоб делать JS-потоки, нужно либо форкаться от V8 и пилить в сторонке мультипоточный W88 ©, либо для каждого потока клонировать экземпляр V8 в рантайме. Есть ещё варианты? Что присоветуете? :blink: |
MetaDriver,
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Простой вопрос: в Collection все ядра работают на многоядерниках, или потоки виртуальные, в рамках одного потока базового движка? Виртуальные потоки - это в принципе удобный (при разработке) синтаксический сахар, но физического прироста производительности не дают. |
Цитата:
А так да - это сахар, но главная фича тут не в скорости, а в том, что можно не боятся зафризить главный поток и писать простой код как и раньше. У меня есть небольшая статейка: https://github.com/kobezzza/Collecti...%B2-Collection |
Цитата:
Так что я бы не отказался поподробнее узнать, чем плохи promise'ы или как их "правильно" реализовать. И по поводу потоков, нужны именно потоки, или worker'ы тоже подойдут? А я пока присоединюсь к melky, будем тихонько ненавидеть java :) По поводу стандартной библиотеки, я бы конечно соврал, если бы не заметил аргумент "хочется большей стабильности", но чем больше стабильность, тем меньше развитие (как считают к слову некоторые иностранные коллеги). Я лично за эволюцию ;) P.S. Если же положение дел так сильно не нравится, всегда можно fork'нуть репозиторий и сделать что-нибудь. Ну или на java перейти, если не вариант ;) |
Цитата:
async function foo() { try { const data = await getData(); const more = await [getMoreData(), getMoreData()]; } catch (err) { ... } } Цитата:
|
Ну вообще я надеялся на какое-то более подробное описание/сравнение. Пока разбирался, вот что нашел, с интересными ссылками.
Итого, вариант c помощью babel: require('babel/register'); function getData() { return new Promise(function(resolve, reject) { resolve('getData'); }) } function getMoreData() { return new Promise(function(resolve, reject) { resolve('getMoreData'); }) } async function foo() { try { const data = await getData(); const more = await* [getMoreData(), getMoreData()]; console.log(data); console.log(more); } catch (err) { console.log('error'); } } foo(); Который запускается так: Код:
$ sudo npm install --global babel И вот вариант без него: function getData() { return new Promise(function(resolve, reject) { resolve('getData'); }) } function getMoreData() { return new Promise(function(resolve, reject) { resolve('getMoreData'); }) } function foo() { getData().then(function(value) { this.data = value; return Promise.all([getMoreData(), getMoreData()]); }).then(function(value) { console.log(this.data); console.log(value); }).catch(function() { console.log('error'); }); } foo(); Так? P.S. И там что-то было про домены какие-то, можно ссылку? А то не гуглится. И про X server, хотя это к melky. Что с ним не так? |
Цитата:
Цитата:
function getData() { return new Promise((resolve, reject) => { resolve('getData'); }); } |
Цитата:
Вообще да, честно говоря я сначала думал, что за проблемы с читабельностью при использовании promise'ов? А потом посмотрел на то, что получилось в предыдущем сообщении... Хотя с другой стороны, вот вы тут жалуетесь, а на другой стороне планеты бородатые мужики на c херачат, а некоторые вообще на assembler, и ничё ;) Но это так, отступление. Собственно, почему все так прицепились к этим промисам? Придумали проблему и мужественно ее решаем? Звучит умно? Я как-то давно тут на форуме предлагал такую штуку как AsyncChain. Правда там не было аналога Promise.all, но в чем дело давайте придумаем: function foo() { var onError = function() { console.log('error'); }; new AsyncChain({onError: onError}) .add(function(NEXT1) { this.data = 'getData'; return NEXT(); }) .add(function(NEXT1) { var this1 = this; new AsyncAllChain({onError: onError}) .add(function(NEXT2) { this.var1 = 'getData'; return NEXT2(); }); .add(function(NEXT2) { this.var2 = 'getData'; return NEXT2(); }) .add(function() { this1.more = [this.var1, this.var2]; }) .go(); return NEXT1(); }) .add(function() { console.log(this.data); console.log(this.more); }) .go(); } foo(); Вроде бы ничего не забыл. Ну это не то чтобы окончательный вариант, критика приветствуется, давайте придумаем как сделать так, чтоб всем было хорошо :) Ну или почти всем, потому что если всем, то тогда promise'ам альтернатив нету, думаю. И по поводу интересных ссылок, альтернативный вариант. Что там дальше? Потоки? Я собственно почему веб воркеры вспомнил? В свое время дедушка Douglas Наше Все Crockford рассказывал, чем так хорош nodejs (можно смотреть с начала, там все интересно) и в чем самая большая ошибка java (the biggest design mistake in java, на 8-ой минуте, 08:40). Понятно, что это для вас не авторитет. Да и я не то чтобы с ним во всем согласен. Но он один из двух людей, которых интересно слушать :) И, кстати, его речь проще всего понимать. Опять я отвлекся, в общем он там говорит, что потоки — это сложно. Event loop наше все. И веб воркеры один из вариантов решения проблемы долгих вычислений. В чем разница? В том что веб воркеры не шарят состояние с основным потоком. Не нужны блокировки и прочая муть. Что говорит google? Что потоки уже есть в nodejs (безопасные, без sharing state). Что можно форкать процессы. И что есть даже модуль cluster, который решает смежную проблему. Так чего же вам не хватает, м? :) Ну, вроде все проблемы решил, или не? :) P.S. Приведите какой-нибудь use case для Promise.all(), плз? |
x-yuri,
Цитата:
|
каких ресурсов?
|
x-yuri,
нужных ресурсов. Неужели сложно представить? Например, куча картинок. |
Если бы не было, я бы не спрашивал. На данный момент мы имеем `async await * [getPicture(), getPicture()]`, но непонятно, что это за приложение. Это сайт? И зачем ему скачивать картинки? Т.е. меня интересует не содержимое функции foo(), а то что за ее пределами, контекст. Если это распространенная операция, то привести пример не должно составлять проблемы. Можно даже несколько ;) Спасибо.
|
x-yuri
Каждый день пользуюсь параллельными операциями, видимо у тебя просто не было задач, вот сёня например писал скрипт накатки данных из одной БД в другую: сначала параллельно чистится все коллекции, а потом параллельно заполняются. async.series([ (cb) => async.each(['users', 'places', 'links'], clear, cb), (cb) => async.each(['users', 'places', 'links'], update, cb) ], cb); ЗЫ: пример на моей любимой либе Async :) *** x-yuri, про остальное не вижу смысла спорить, т.к. у нас очевидно совсем разный опыт работы с JS и нодой (без обид), поэтому ты не принимаешь моих доводов. К тому же критиковать язык и платформу нужно, в первую очередь для её развития. Если кто помнит, то на этом форуме я был первым пропагандистом ES6 (уже больше 2-х лет прошло) и меня тут считали хипстером, который почему то плюётся от ES5, а теперь думаю мало кто захочет вернуться на то Г. :) Классные вещи ожидаются в ES7, возможно это будет действительно качественное развитие языка, т.к. ES6 - это по большей части сахар. Я всегда расписываю свои претензии и привожу примеры из других языков и доводы, но блин, я уже задолбался постоянно писать одно и тоже) |
Цитата:
Цитата:
Цитата:
Цитата:
|
kobezzza,
Цитата:
Цитата:
|
Цитата:
app.post("/api/articles", co(function*(req, res, next){ let article = new Article(); try { yield article.save(); } catch (err) { return next(err); } })); В ES7 добавится пущий сахар для этого - async/await. |
kobezzza, хорошо, давай немного по-другому поставим вопрос, Promise.all используется в типичных задачах при генерации html-страниц? В качестве серверного языка я в основном использовал php или ruby и для меня не очевидно, где можно применить параллельное выполнение операций. Можно больше примеров типичных задач, касающихся работы сайтов?
По поводу опыта. У тебя больше опыта работы с nodejs? Не сомневаюсь. Я не знаю es6, es7? Не спорю. По поводу опыта работы с js, я думаю ты меня недооцениваешь. Но какая разница? Мы же здесь не для того чтобы "кармой" мерятся, правда? И аргумент "у тебя мало опыта, чтобы меня понять" считаю поцоватым. Я такого себе не позволяю. Объясни свою точку зрения. Если с тобой не согласны, тут два варианта. В обоих случаях спорить не надо. По поводу неприятия доводов, это не совсем так. Если я пишу "Так чего же вам не хватает, м?", это не значит, что я уверен, что проблема отсутствует. Я погуглил, нашел ряд решений вопроса, и пытаюсь у вас выяснить, что не так. Возможно, не самым лучшим способом :) Да и по остальным вопросам, я не против чтобы меня переубедили ;) По поводу стандартной библиотеки действительно не принимаю, пока что. Я не думаю, что в nodejs все идеально. Но ведь проблема выбора существует не только в ноде. Есть плагины jquery, пакеты linux, ruby gems и много всего другого. И как-то люди с этим живут, без патронажа корпораций-монстров. Выбор может осуществляться методом "что первое в google", ruby-toolbox.com... Чем нода кардинально отличается? По поводу async/await, плохого ничего сказать не могу, но это не выглядит как критичный недостаток nodejs. В данном случае у нас подход разный. У тебя как в анекдоте: "В аптеке: — Дайте мне таблеток от жадности, и побольше" :) У меня скорее минималистичный. Важных вещей мало. Программистам свойственен перфекционизм, в результате они тратят время на то, что не важно. Помни о смерти ;) Еще наверное тон спровоцировал, скромнее нужно быть, скромнее ;) Цитата:
Цитата:
И твой код это аналог для этого? app.post("/api/articles", function(req, res, next) { var article = new Article(); domain.create().on('error', function(err) { next(err); }).run(function() { article.save(); }) }); |
Цитата:
Цитата:
|
Тут версию 2 уже слепили. https://github.com/iojs/io.js/blob/master/CHANGELOG.md
Мне кажется или разрабы бегут впереди паровоза? Изменений, тянущих на 2.0 что то я не заметил. Или у них версионирование как у хрома и через год мы увидим io.js v20.0? |
Цитата:
https://github.com/iojs/io.js/blob/m...eaking-changes |
Годный релиз. Осталось воркеры добавить)
|
Erolast, что-то это похоже разные вещи:
var domain = require('domain'); domain.create().on('error', function(err) { console.log('caught'); }).run(function() { throw new Error; // это ловим setTimeout(function() { throw new Error; // и это ловим }); }) require('babel/register'); var co = require('co'); co(function* () { try { var result = yield new Promise((resolve, reject) => { throw new Error; // это ловим setTimeout(() => { throw new Error; // это нет }); }); return result; } catch(e) { console.log('caught'); } }); Домены предназначены для того, чтобы ловить исключения в асинхронных вызовах, для ошибок, не учтенных разработчиком. co + геренаторы, чтобы преобразовывать reject'ы в исключения и только на текущем уровне. Кроме того, использовать генераторы, чтобы ловить исключения... очередной костыль, не? |
https://github.com/iojs/io.js/issues...ment-101828384
Судя по голосованию, объединение будет) |
Цитата:
Проекты Node.js и io.js объединяются под эгидой организации Node Foundation |
Да будет мир во всем мире! :)
|
|
kobezzza,
хочу такую же штуку, но только со SpiderMonkey. Или лучше с любым двиглом на выбор. |
Цитата:
|
Ну что, граждане! Как думаете, мы увидим node.js 3.0 или node.js 1.0? Ну и кто с кем мержится?
|
madgals,
думаю, что будет первая версия. На сколько я понял, из io.js будут лить изменения в node.js. Ну оно и вполне логично, io.js гораздо дальше ушёл. |
Часовой пояс GMT +3, время: 10:16. |