Асинхронное программирование: Примитивы высокого уровня

    После появления асинхронного каркаса Twisted концепция отложенного результата (continuable) стала очень популярной.

    Прежде всего рекомендую прочитать статьи: Асинхронное программирование: концепция Deferred, Deffered для JavaScript.

    Но пользоваться отложенными результатами не очень удобно без абстракций более высокого уровня. И теперь у нас есть каркас Do.

    Теперь мы можем выполнять такие действия:

    Выполнить несколько действий параллельно


    // Multiple arguments
    Do.parallel(
      Do.read("/etc/passwd"),
      Do.read(__filename)
    )(function (passwd, self) {
      // Do something
    }, error_handler);

    // Single argument
    var actions = [
      Do.read("/etc/passwd"),
      Do.read("__filename")
    ];
    Do.parallel(actions)(function (results) {
      // Do something
    }, error_handler);



    Выполнить несколько действий последовательно


    // Multiple arguments
    Do.chain(
      Do.read(__filename),
      function (text) {
        return Do.save("newfile", text);
      },
      function () {
        return Do.stat("newfile");
      }
    )(function (stat) {
      // Do something
    }, error_handler);

    // Single argument
    var actions = [
      Do.read(__filename),
      function (text) {
        return Do.save("newfile", text);
      },
      function () {
        return Do.stat("newfile");
      }
    ];
    Do.chain(actions)(function (stat) {
      // Do something
    }, error_handler);



    Отобразить исходный массив на результирующий асинхронно


    var files = ['users.json', 'pages.json', 'products.json'];
    function load_file(filename, callback, errback) {
      fs.read(filename)(function (data) {
        callback([filename, data]);
      }, errback);
    }
    Do.map(files, load_file)(function (contents) {
      // Do something
    }, error_handler);


    Отфильтровать массив асинхронно


    var files = ['users.json', 'pages.json', 'products.json'];
    function is_file(filename, callback, errback) {
      fs.stat(filename)(function (stat) {
        callback(stat.isFile());
      }, errback);
    }
    Do.filter(files, is_file)(function (filtered_files) {
      // Do something
    }, error_handler);



    Кроме того, предоставляются врапперы для node.js. Проект на github.
    Поделиться публикацией
    Комментарии 12
    • НЛО прилетело и опубликовало эту надпись здесь
        0
        Серверный Javascript со всеми его возможностями :)

        Но библиотека вполне юзабельна и на клиенте :)
          0
          Пассворды на клиенте читать? )))
            +2
            Смотря что за клиент :)
            0
            если имеется ввиду браузер, то как реализована асинхронность?
              0
              и что происходил в случае возникновения ошибок в коллбэках?
                0
                При выполнении каких-то задач браузером мы вполне можем повесить коллбэк на завершение вызова и закончить выполнение. Типичное $.getJSON(url, params, callback) — уже даёт асинхронность. Или setTimeout(callback, 0);
                  0
                  м… то есть асинхронность нужно реализовывать самостоятельно, а Do лишь произведёт синхронизацию? и всё-таки что насчёт иключений?
                    0
                    Вчера не было времени проверить, но судя по коду, обработки исключений не предусмотрено.
            0
            Название страшное «Высокоуровневые асинхронные абстракции» o_O
              0
              Переименовал :)
                0
                «Асинхронное программирование: Примитивы высокого уровня» O_o
                Ну так конешно лучше :-D

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое