LINUX.ORG.RU

Асинхронщина

 ,


0

1

Решил тут потыкать Node.js. Вроде не делаю ничего сложного, но уже в самом начале у меня от асинхронщины разорвало пердак. В общем, мужики, помогите.

Есть некий модуль в вакууме, который внутри себя дергает другой модуль. Так уж вышло, что функция этого другого модуля не возвращает значение, как все нормальные люди, а ждет в аргументе коллбек, в который передает результат.

В принципе, обычная практика, но проблема вот в чем. Из за этого коллбека мне теперь нельзя просто взять и вернуть значение в переменную, в мой модуль нужно тоже пробросить коллбек, который будет проброшен во второй модуль и т.д.

Я конечно мог бы все оставить так, однако, проблема всплывает где-нибудь в другом месте и извращаться все равно придется. Например, я даже не могу нормально автотест к этому говну написать, ибо assert внутри коллбека не срабатывает.

Если наглядно, сейчас все выглядит как-то так:

module.exports = function(data, callback) {
  someModule(data, function(result) {
    callback(result);
  );
}

Ну и в вызов я должен пробросить коллбек:

myModule(data, function(result) {
  //
});

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

var result = myModule(data);

При синхронном выполнении, код модуля выглядел-бы примерно так:

module.exports = function(data) {
  var output;
  someModule(data, function(result) {
    output = result;
  });
  return output;
}

Но как это провернуть я уже обгуглился. Повкуривал в промисы, оказалось - те-же коллбеки, только цепочкой. Объяснил, надеюсь, понятно. В общем, ткните носом, как решаются задачи подобного рода, с меня пивасик.


Вкуривай генераторы, но в целом дело то не в языке а в ноде.

zz ★★★★ ()

Решил тут потыкать Node.js. Вроде не делаю ничего сложного, но уже в самом начале у меня от асинхронщины разорвало пердак.

На вики написано, что на нём даже для микроконтроллёров писать можно.

//Дальше не читал, и не буду.

nanoolinux ★★★★ ()

Любая асинхронная операция, проброшенная как есть, заражает весь стек вызовов, это очевидно. Кстати в первом блоке кода можно просто пробросить callback, а не заворачивать его в еще одну пустышку.

А вообще могу рассказать, как я «разруливаю» асинхронность на Lua, может и в js чо удастся придумать, но он афаик не имеет необходимых примитивов.

arturpub ★★ ()

чуть мозги повернуть прийдется, для тестов есть свои инструменты, есть даже метаязыки (iced-coffee-script), но вообще все так как ты написал

trashymichael ★★★ ()

для «ассинхронщины» нужна событийность. Пошлешь внешнее событие на вход: все разрешится. Посмотри для кругозора примеры (дверь с кодом и другое) gen_fsm из эрланга

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