Как набросать систему, управляемую событиями?

Я пытаюсь спроектировать систему в Node.js (попытка решить одну из мои более ранние проблемы с использованием параллелизма Node), но я столкнулся с проблемой, пытаясь понять, как нарисовать план того, как эта штука должна работать.

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

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

Фотографии были бы очень полезны для этого. Спасибо.

Изменить: мне нужно что-то более детализированное, чем UML, в частности, что-то, что поможет мне перейти от блокирующей и объектно-ориентированной структуры программирования, в которой я чувствую себя комфортно, к неблокирующей и управляемой событиями структуре, в которой я незнаком.


person Jordan Feldstein    schedule 12.01.2011    source источник


Ответы (2)


На основе http://i.stack.imgur.com/9DDQP.png того, что вы need — хорошая библиотека потоков, которая позволяет конвейеризировать синхронные и асинхронные вызовы в node.

Одной из таких библиотек является https://github.com/isaacs/slide-flow-control. (посмотрите слайд preso там тоже), а схема кода того, что вам нужно сделать, приведена ниже.

Он самодокументируемый и, как вы видите, довольно лаконичный, чистый nodejs, uml, img и т. д. не требуется.

var chain = require("slide/chain")
    , asyncMap = require("slide/async-map")
    ;

// start processing
main_loop(function() { 
    console.log("its done"); // when finished
});

function main_loop(cb) {
    var res = [];
    // each entry in chain below fires sequentially i.e. after
    // the previous function completes
    chain
        ( [ [start_update_q, "user-foo"]
          , [get_followed_users, chain.last]
          , [get_favorites, chain.last]
          , [calc_new_q]
          , [push_results, chain.last]
          ]
          , res
          , cb
        )
}

function get_favorites(users, cb) {
    function fn(user, cb_) {
        get_one_users_favorites(user, cb_);
    }
    // this will run thru get_favorites in parallel
    // and after all user favorites are gotten it will fire 
    // callback cb
    asyncMap(users, fn, cb);
}

// code in the various functions in chain here,
// remember to either return the callback on completion.
// or pass it as an arg to the async call you make within the
// function as above i.e. asyncMap will fire cb on completion
person molicule    schedule 14.01.2011
comment
Это именно то, что я искал. Я начал экспериментировать с Seq, но потом сломал установку Node/npm: goo.gl/fhilo - person Jordan Feldstein; 18.01.2011

UML может подойти. Я бы посмотрел диаграммы поведения.

person John Percival Hackworth    schedule 12.01.2011
comment
Хорошее начало, и у меня уже есть такая диаграмма: i.imgur.com/9DDQP. png Но я ищу что-то, что более непосредственно поможет мне перейти от идеи/диаграммы к Событийному коду. Мне трудно представить, что мне нужно написать, когда я перехожу от ООП к стилям кода, управляемым событиями. - person Jordan Feldstein; 14.01.2011