После появления асинхронного каркаса Twisted концепция отложенного результата (continuable) стала очень популярной.
Прежде всего рекомендую прочитать статьи: Асинхронное программирование: концепция Deferred, Deffered для JavaScript.
Но пользоваться отложенными результатами не очень удобно без абстракций более высокого уровня. И теперь у нас есть каркас Do.
Теперь мы можем выполнять такие действия:
Кроме того, предоставляются врапперы для node.js. Проект на github.
Прежде всего рекомендую прочитать статьи: Асинхронное программирование: концепция 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.