LINUX.ORG.RU

node.js - как дождаться события?


0

1

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

как можно просто получить массив строк из постгреса или поправить вот такой код:
[code=javascript]
   var error;
   var flag=1;
   sth.on('error',function(e) {
      console.log(«sql.execute_helper - error»);
      error=e;flag=0;
   });
   sth.on('row',function(row) {
      console.log(«sql.execute_helper - row»);
      if (cnt==1) ret=row; else ret.push(row);
      if (ret && cnt==ret.length) flag=0;
   });
   sth.on('end',function() {
      console.log(«sql.execute_helper - end»);
      flag=0;
   });
   console.log(«sql.execute_helper - entring query loop»);
   while(flag) {
      // Что вставить вот сюда?
   }
   console.log(«sql.execute_helper - out»);
   if (error) throw(e);
   return ret;
[/code]

★★★

> я не хочу делать так как советуют разработчики,

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

archimag ★★★
()
Ответ на: комментарий от archimag

окей, объясни мне как это сделать правильно.

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

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

окей, объясни мне как это сделать правильно.

Примерно так:

function myfunction (cnt, sth, successCallback, failCallback) {
    var rows = [];

    function errorHandler (e) {
        console.log("sql.execute_helper - error");
        failCallback();
    }

    function rowHandler (row) {
        console.log("sql.execute_helper - row");

        rows.push(row);
        
        if (cnt == rows.length) {
            successCallback(rows);
        }
    }

    function endHandler () {
        console.log("sql.execute_helper - end");
        successCallback(rows);
    }

    sth.on('error', errorHandler);
    sth.on('row', rowHanlder);
    sth.end('end', endHandler);
}

Твой код несколько неполон, не совсем понятен контекст вызова, плюс я знаю, надо ли делать для собый off (наверняка). Но идея должна быть понятна.

archimag ★★★
()

события ... события ... события

Ну, видите ли, вы работаете с event-driven фреймворком - что же еще вы хотите там увидеть? Замыкания - возможно, лучшее, что есть в javascript. Если уж вы взялись за node.js - извольте соответствовать. Иначе, как сказал archimag, стоит задуматься об использовании другого инструмента.

shylent
()
Ответ на: комментарий от shylent

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

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

ВОТ, реальная задача - объясните как сделать: вот есть у меня контроллер, который запускает несколько model (например, «список накладных» и «список платёжек»), а потом должен запустить вьюху которая html нарисует.

предположим, я делаю некий метод, ок:

space={
  ...всякая фигня для вьюхи
};
накладные.load_list(function(result) {space.накладные=result;})
платёжки.load_list(function(result) {space.платёжки=result;})
но написать
return views.render('накладные_и_платёжки.html',space); я не могу

можно конечно вписать

платёжки.load_list(function(result) {space.платёжки=result;return views.render()})
но какая гарантия что платёжки выполнятся позже чем накладные?

вобщем, объясните мне идеологию и я буду мега-благодарен

vahvarh ★★★
() автор топика

Если не лень разбираться могу подтолкнуть в нужную сторону. Ассинхронный код без колбеков можно писать с помощью сoroutines. Посмотри как сделано в питоне, к примеру как в tornado swirl и на gevent. Корутины придется самому навоять. И я хз быстрый ли у тебя код получится.

dizza ★★★★★
()
Ответ на: комментарий от dizza

> Ассинхронный код без колбеков можно писать с помощью сoroutines.

Абсолютно не нужно в JavaScript.

могу подтолкнуть в нужную сторону.


Неправильная сторона, если говорить о JS.

archimag ★★★
()
Ответ на: комментарий от vahvarh

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

Что не так с событиями?

> это ж не любимый мною эрланг

Какая либо аналогия между node.js и эрланг не уместна, это совершенно разные системы, а статья в последнем номере ПФП на эту тему просто идиотизм.

> ВОТ, реальная задача - объясните как сделать

function myFunction (callback) {
    var space =  {
        // ... всякая фигня для вьюхи
    }

    function maybeFinish () {
        if (space.invoces && space.payments) {
            callback(views.render('накладные_и_платёжки.html',space));
        }
    }

    function handleInvoces (data) {
        space.invoces = data;
        myabeFinish();
    }

    function handlePayments (data) {
        space.payments = data;
        myabeFinish();
    }

    invoces.loadList(handleInvoces);
    payments.loadList(handlePayments);
}

Твоя проблема в том, что ты постоянно хочешь что-нибудь вернуть синхронным образом. А в js в такой схеме надо не возращать, а передавать управление дальше по цепочке вызовово.

archimag ★★★
()
Ответ на: комментарий от archimag

тебе не кажется что это одновременно
1. запутывает код
2. усложняет код
3. увеличивет размер кода
4. замедляет выполнение программы (особенно если учесть что node.js не держит треды?)

vahvarh ★★★
() автор топика
Ответ на: комментарий от vahvarh

Но вообще идею понял, буду медитировать и пытаться понять, где из неё можно выжать плюсы.

vahvarh ★★★
() автор топика
Ответ на: комментарий от archimag

Абсолютно не нужно в JavaScript.

В таком случае javascript не лучший выбор для ассинхронного программирования.

dizza ★★★★★
()
Ответ на: комментарий от vahvarh

Но вообще идею понял, буду медитировать и пытаться понять, где из неё можно выжать плюсы.

Плюсов нету. Только лучшая производительность.

dizza ★★★★★
()
Ответ на: комментарий от vahvarh

> запутывает код

Нет. Код запутывают программисты ) Если правильно его структурировать, то всё получается достаточно ясно и понятно.

усложняет код


Немного. За всё надо платить.

увеличивет размер кода


Не на много.

замедляет выполнение программы


С чего вдруг?

archimag ★★★
()
Ответ на: комментарий от dizza

> javascript не лучший выбор для ассинхронного программирования

Однако, это наиболее активно используемый язык в этой области, если учесть клиентский код AJAX-приложений.

Плюсов нету. Только лучшая производительность.


Простота и полная прозрачность, в отличие от схемы с сoroutines.

JavaScript-стиль подразумевает выполнение CPS-преобразований кода вручную, что в случае с JavaScript не вызывает особых проблем.

archimag ★★★
()
Ответ на: комментарий от archimag

> Какая либо аналогия между node.js и эрланг не уместна, это совершенно разные системы, а статья в последнем номере ПФП на эту тему просто идиотизм.

Идиотизм - это превращать язык в то, для чего он не предназначен. А статья вполне адекватна.

Твоя проблема в том, что ты постоянно хочешь что-нибудь вернуть синхронным образом. А в js в такой схеме надо не возращать, а передавать управление дальше по цепочке вызовово.

Это не его проблема, а проблема языка :)

Нет. Код запутывают программисты ) Если правильно его структурировать, то всё получается достаточно ясно и понятно.

Да ладно, невозможно писать в таком духе и не запутать код. Просто постепенно начинаешь привыкать к подобной «запутанности» и это создаёт иллюзию мастерства.

zenith ★★★
()
Ответ на: комментарий от zenith

> Идиотизм - это превращать язык в то, для чего он не предназначен.

Какой язык для чего предназначен определяет практика. Темпы развития технологии, как бы, намекают на обратное.

А статья вполне адекватна.


С точки зрения человека, не понимающего, что такое Node.js и почему Node.js нельзя сравнивать с Erlang, да, адекватная.

невозможно писать в таком духе и не запутать код.


Однако пишут и пишут очень много. И жалоб, что код на JS слишком запутан и труден для понимая мне до сих пор слышать не приходилось.

archimag ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.