Pull to refresh

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

Reading time2 min
Views3.1K
После появления асинхронного каркаса 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.
Tags:
Hubs:
+9
Comments12

Articles

Change theme settings