Как сделать набросок управляемой событиями системы? - PullRequest
4 голосов
/ 12 января 2011

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Основываясь на http://i.stack.imgur.com/9DDQP.png, вам нужна хорошая библиотека потоков, которая позволяет передавать по конвейеру синхронизированные и асинхронные вызовы в узле.

Одна из таких библиотек - https://github.com/isaacs/slide-flow-control (посмотрите там также slide 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
0 голосов
/ 12 января 2011

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

...