Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   IO.JS серверная реализация JavaScript (https://javascript.ru/forum/node-js-io-js/52839-io-js-servernaya-realizaciya-javascript.html)

kobezzza 27.02.2015 19:06

Цитата:

Сообщение от Safort (Сообщение 358871)
melky,
так они же как раз только обсуждают. Если придут к согласию(а они придут, инфа 146%), то мы вскоре узнаем об этом в новостях.

145%:D

Safort 19.03.2015 23:50

kobezzza,
чот как-то они тянут)

Safort 19.03.2015 23:50

Релиз 1.6
https://github.com/iojs/io.js/blob/v...otable-changes

Safort 20.03.2015 07:44

Кстати, в io.js всё таки добавят воркеры)
https://github.com/iojs/io.js/pull/1159

kobezzza 20.03.2015 10:39

Цитата:

Сообщение от Safort (Сообщение 362208)
Кстати, в io.js всё таки добавят воркеры)
https://github.com/iojs/io.js/pull/1159

Алилуйя:)

MetaDriver 29.03.2015 20:58

Цитата:

Сообщение от kobezzza (Сообщение 350740)
Цитата:

Сообщение от cyber
Мне вот интересно что мешает в nodejs сделать нормальные потоки?

Религия :) Как по мне: добавили хоть какие бы.

Это вряд ли. V8 - однопоточный.
Т.е. чтоб делать JS-потоки, нужно либо форкаться от V8 и пилить в сторонке мультипоточный W88 ©, либо для каждого потока клонировать экземпляр V8 в рантайме. Есть ещё варианты? Что присоветуете? :blink:

Safort 29.03.2015 21:43

MetaDriver,
Цитата:

Это вряд ли. V8 - однопоточный.
Это всё не важно. ВебВоркеры в браузерах сделали, значит и в ноде/ио особых проблем не должно быть.

kobezzza 31.03.2015 22:07

Цитата:

Сообщение от Safort (Сообщение 363808)
MetaDriver,

Это всё не важно. ВебВоркеры в браузерах сделали, значит и в ноде/ио особых проблем не должно быть.

Более того, я сделал потоки в своём Collection, поэтому всё в руках разрабов :)

Safort 31.03.2015 23:08

Цитата:

Сообщение от kobezzza (Сообщение 364268)
Более того, я сделал потоки в своём Collection, поэтому всё в руках разрабов :)

Тем более)

MetaDriver 01.04.2015 01:58

Цитата:

Сообщение от kobezzza (Сообщение 364268)
Более того, я сделал потоки в своём Collection, поэтому всё в руках разрабов :)

Интересно.
Простой вопрос: в Collection все ядра работают на многоядерниках, или потоки виртуальные, в рамках одного потока базового движка?
Виртуальные потоки - это в принципе удобный (при разработке) синтаксический сахар, но физического прироста производительности не дают.

kobezzza 01.04.2015 06:31

Цитата:

Сообщение от MetaDriver (Сообщение 364317)
Интересно.
Простой вопрос: в Collection все ядра работают на многоядерниках, или потоки виртуальные, в рамках одного потока базового движка?
Виртуальные потоки - это в принципе удобный (при разработке) синтаксический сахар, но физического прироста производительности не дают.

Потоки виртуальные, но с другой стороны, их можно запускать внутри воркера или дочернего процесса ноды и тогда они будут исполнятся на разных ядрах (если они есть конечно :) ).

А так да - это сахар, но главная фича тут не в скорости, а в том, что можно не боятся зафризить главный поток и писать простой код как и раньше.

У меня есть небольшая статейка: https://github.com/kobezzza/Collecti...%B2-Collection

x-yuri 26.04.2015 20:41

Цитата:

Сообщение от kobezzza (Сообщение 350784)
...опять приведу пример Java (знаю, что достал с ней, но в этом плане на неё должны все равняться)

Да, только одну тему прочитать успел, а уже достал :stop: За тем какая java "хорошая", не видно что ты хочешь сказать. Основные аргументы "как в java" и "правильно".

Так что я бы не отказался поподробнее узнать, чем плохи promise'ы или как их "правильно" реализовать. И по поводу потоков, нужны именно потоки, или worker'ы тоже подойдут? А я пока присоединюсь к melky, будем тихонько ненавидеть java :)

По поводу стандартной библиотеки, я бы конечно соврал, если бы не заметил аргумент "хочется большей стабильности", но чем больше стабильность, тем меньше развитие (как считают к слову некоторые иностранные коллеги). Я лично за эволюцию ;)

P.S. Если же положение дел так сильно не нравится, всегда можно fork'нуть репозиторий и сделать что-нибудь. Ну или на java перейти, если не вариант ;)

kobezzza 27.04.2015 11:19

Цитата:

Так что я бы не отказался поподробнее узнать, чем плохи promise'ы или как их "правильно" реализовать.
Асинхронный код, неудобная обработка ошибок. Эти проблемы решают async / await, которые по сути являются сахаром над Promise и хорошо зарекомендовали себя в других языках. В ES7 ожидается поддержка, но с Babel можно юзать уже сейчас.

async function foo() {
    try {
      const data = await getData();
      const more = await [getMoreData(), getMoreData()];
    
    } catch (err) {
      ...
    }
}


Цитата:

И по поводу потоков, нужны именно потоки, или worker'ы тоже подойдут?
Я был бы рад и воркерам.

x-yuri 28.04.2015 14:57

Ну вообще я надеялся на какое-то более подробное описание/сравнение. Пока разбирался, вот что нашел, с интересными ссылками.

Итого, вариант 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
$ npm install babel
$ babel --stage 0 1.js | node


И вот вариант без него:

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. Что с ним не так?

Erolast 28.04.2015 15:02

Цитата:

И там что-то было про домены какие-то, можно ссылку?
https://nodejs.org/api/domain.html. Это костыль для обработки ошибок в асинхронном коде, сейчас, с появлением generator expressions, становится deprecated.

Цитата:

Итого, вариант c помощью babel:
Забыл про очень классные стрелочные функции:
function getData() {
  return new Promise((resolve, reject) => {
    resolve('getData');
  });
}

x-yuri 29.04.2015 19:36

Цитата:

Сообщение от Erolast (Сообщение 368598)
https://nodejs.org/api/domain.html. Это костыль для обработки ошибок в асинхронном коде, сейчас, с появлением generator expressions, становится deprecated.
[/js]

а почему костыль обоснуешь? и как это связано с generator expressions?

Вообще да, честно говоря я сначала думал, что за проблемы с читабельностью при использовании 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(), плз?

Safort 29.04.2015 19:58

x-yuri,
Цитата:

P.S. Приведите какой-нибудь use case для Promise.all(), плз?
Например, нам нужно одновременно загрузить несколько ресурсов из сети и только после этого запустить функцию обработчик.

x-yuri 29.04.2015 21:19

каких ресурсов?

Safort 29.04.2015 22:29

x-yuri,
нужных ресурсов. Неужели сложно представить? Например, куча картинок.

x-yuri 30.04.2015 00:05

Если бы не было, я бы не спрашивал. На данный момент мы имеем `async await * [getPicture(), getPicture()]`, но непонятно, что это за приложение. Это сайт? И зачем ему скачивать картинки? Т.е. меня интересует не содержимое функции foo(), а то что за ее пределами, контекст. Если это распространенная операция, то привести пример не должно составлять проблемы. Можно даже несколько ;) Спасибо.

kobezzza 30.04.2015 20:55

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 - это по большей части сахар.

Я всегда расписываю свои претензии и привожу примеры из других языков и доводы, но блин, я уже задолбался постоянно писать одно и тоже)

Gozar 30.04.2015 21:41

Цитата:

Сообщение от kobezzza
меня тут считали хипстером, который почему то плюётся от ES5

Имхо, я не перешел на питон потому, что читал то, что ты пишешь про ES6. Был уже на грани. Про хипстера не в курсе :)

Цитата:

Сообщение от kobezzza
ES6 - это по большей части

то, что нужно было сделать перед тем как запустить js в продакшн.

Цитата:

Сообщение от kobezzza
любимой либе Async

Жаль нет времени сейчас освоить, но обязательно выделю.

Цитата:

Сообщение от kobezzza
задолбался постоянно писать одно и тоже

Я например не всегда понимаю, что мне отвечают, т.к. иногда нужные знания отсутствуют. Запиминаю и прокручиваю в голове при подходящем случае. Очень часто доходит потом :)

Safort 30.04.2015 21:53

kobezzza,
Цитата:

Если кто помнит, то на этом форуме я был первым пропагандистом ES6 (уже больше 2-х лет прошло)
Эх, я в это время как раз временно ушёл с форума. А ведь мог бы первым быть!(

Цитата:

Я всегда расписываю свои претензии и привожу примеры из других языков и доводы, но блин, я уже задолбался постоянно писать одно и тоже)
Зачем писать? Зачем страдать? Ведь можно просто ссылку на тему дать!

Erolast 01.05.2015 07:52

Цитата:

а почему костыль обоснуешь? и как это связано с generator expressions?
Потому что с помощью генераторов можно добиться нормального привычного синтаксиса отлоав ошибок через try-catch:
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.

x-yuri 03.05.2015 13:52

kobezzza, хорошо, давай немного по-другому поставим вопрос, Promise.all используется в типичных задачах при генерации html-страниц? В качестве серверного языка я в основном использовал php или ruby и для меня не очевидно, где можно применить параллельное выполнение операций. Можно больше примеров типичных задач, касающихся работы сайтов?

По поводу опыта. У тебя больше опыта работы с nodejs? Не сомневаюсь. Я не знаю es6, es7? Не спорю. По поводу опыта работы с js, я думаю ты меня недооцениваешь. Но какая разница? Мы же здесь не для того чтобы "кармой" мерятся, правда? И аргумент "у тебя мало опыта, чтобы меня понять" считаю поцоватым. Я такого себе не позволяю. Объясни свою точку зрения. Если с тобой не согласны, тут два варианта. В обоих случаях спорить не надо.

По поводу неприятия доводов, это не совсем так. Если я пишу "Так чего же вам не хватает, м?", это не значит, что я уверен, что проблема отсутствует. Я погуглил, нашел ряд решений вопроса, и пытаюсь у вас выяснить, что не так. Возможно, не самым лучшим способом :) Да и по остальным вопросам, я не против чтобы меня переубедили ;)

По поводу стандартной библиотеки действительно не принимаю, пока что. Я не думаю, что в nodejs все идеально. Но ведь проблема выбора существует не только в ноде. Есть плагины jquery, пакеты linux, ruby gems и много всего другого. И как-то люди с этим живут, без патронажа корпораций-монстров. Выбор может осуществляться методом "что первое в google", ruby-toolbox.com... Чем нода кардинально отличается?

По поводу async/await, плохого ничего сказать не могу, но это не выглядит как критичный недостаток nodejs. В данном случае у нас подход разный. У тебя как в анекдоте: "В аптеке: — Дайте мне таблеток от жадности, и побольше" :) У меня скорее минималистичный. Важных вещей мало. Программистам свойственен перфекционизм, в результате они тратят время на то, что не важно. Помни о смерти ;)

Еще наверное тон спровоцировал, скромнее нужно быть, скромнее ;)

Цитата:

Сообщение от kobezzza
Я всегда расписываю свои претензии и привожу примеры из других языков и доводы, но блин, я уже задолбался постоянно писать одно и тоже)

Так появляются faq'и ;)

Цитата:

Сообщение от Erolast
Потому что с помощью генераторов можно добиться нормального привычного синтаксиса отлоав ошибок через try-catch:

Т.е. все же речь о generators (generator functions), а не generator expressions.

И твой код это аналог для этого?

app.post("/api/articles", function(req, res, next) {
    var article = new Article();
    domain.create().on('error', function(err) {
        next(err);
    }).run(function() {
        article.save();
    })
});

Erolast 03.05.2015 18:28

Цитата:

Т.е. все же речь о generators (generator functions), а не generator expressions.
Тьфу, да, описался.

Цитата:

И твой код это аналог для этого?
Ну, если не учитывать кучу граблей работы с доменами - да, примерно так.

madgals 05.05.2015 09:31

Тут версию 2 уже слепили. https://github.com/iojs/io.js/blob/master/CHANGELOG.md
Мне кажется или разрабы бегут впереди паровоза? Изменений, тянущих на 2.0 что то я не заметил. Или у них версионирование как у хрома и через год мы увидим io.js v20.0?

kobezzza 05.05.2015 09:50

Цитата:

Сообщение от madgals (Сообщение 369479)
Тут версию 2 уже слепили. https://github.com/iojs/io.js/blob/master/CHANGELOG.md
Мне кажется или разрабы бегут впереди паровоза? Изменений, тянущих на 2.0 что то я не заметил. Или у них версионирование как у хрома и через год мы увидим io.js v20.0?

У них semver. Обновление мажорной цифры просто означает о внесении ломающих изменений по сравнению с прошлыми версиями и не более того.

https://github.com/iojs/io.js/blob/m...eaking-changes

Safort 05.05.2015 10:15

Годный релиз. Осталось воркеры добавить)

x-yuri 14.05.2015 09:41

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'ы в исключения и только на текущем уровне. Кроме того, использовать генераторы, чтобы ловить исключения... очередной костыль, не?

Safort 14.05.2015 10:41

https://github.com/iojs/io.js/issues...ment-101828384
Судя по голосованию, объединение будет)

kobezzza 14.05.2015 11:27

Цитата:

Сообщение от Safort (Сообщение 370745)
https://github.com/iojs/io.js/issues...ment-101828384
Судя по голосованию, объединение будет)

Угу :)

Проекты Node.js и io.js объединяются под эгидой организации Node Foundation

Gozar 15.05.2015 15:02

Да будет мир во всем мире! :)

kobezzza 15.05.2015 17:29

https://github.com/Microsoft/node

Safort 15.05.2015 18:26

kobezzza,
хочу такую же штуку, но только со SpiderMonkey. Или лучше с любым двиглом на выбор.

kobezzza 15.05.2015 18:42

Цитата:

Сообщение от Safort (Сообщение 371007)
kobezzza,
хочу такую же штуку, но только со SpiderMonkey. Или лучше с любым двиглом на выбор.

Угу :) Хотя Chakra ща самая топовая по поддержке ES6.

madgals 16.05.2015 14:16

Ну что, граждане! Как думаете, мы увидим node.js 3.0 или node.js 1.0? Ну и кто с кем мержится?

Safort 16.05.2015 18:30

madgals,
думаю, что будет первая версия. На сколько я понял, из io.js будут лить изменения в node.js. Ну оно и вполне логично, io.js гораздо дальше ушёл.


Часовой пояс GMT +3, время: 10:16.