var Task = require('parallel').Task;
// Here is your typical async function
var myAsyncFunction = function myAsyncFunction(id, callback) {
database.getEntry(id, function (data) {
callback(data);
});
};
// We want to make a task that executes `myAsyncFunction` and passes
// 1 & 3 as the first argument. Note: You do not need to supply a
// callback argument
// Every 'task entry' needs a unique id so it can be identified later.
var myTask = new Task({
1: [myAsyncFunction, 1], // This task has the id `1`, calls myAsyncFunction
// and passes `1` as the first argument
2: [myAsyncFunction, 3] // This task has the id `2`, calls myAsyncFunction
// and passes `3` as the first argument
});
// We can then add 'listeners' to task entries using `bind`, and
// referencing the entry id
// We pass a callback as the last argument, which is called like
// it was passed directly to the async function.
myTask.bind(1, function (data) {
doSomethingWith(data);
});
// We can also bind to multiple entries
myTask.bind(1, 2, function (data) {
doSomethingElseWith(data);
});
// We then run the task with `run`. The only argument is a callback
// which is passed the entry id as the first argument, and the additional
// returned arguments are suffixed. The task id is `null` when everything
// is finished.
myTask.run(function (entry_id, data) {
// This will be true when everything is done
if (entry_id === null) {
moveOnAndDoSomethingElse();
}
// This is true when entry 1 is done
else if (entry_id === 1) {
doSomethingWith(data);
}
// This is true when entry 2 is done
else if (entry_id === 2) {
doSomethingElseWith(data);
}
});
// You can also add tasks dynamically
// This will create 2 task entries that have the id's 0 & 1, and call
// `myAsyncFunction` with the first argument as 0 & 2 respectivly
myTask = new Task();
for (var i = 0; i < 2; i++) {
myTask.add(i, [myAsyncFunction, i * 2]);
}
// We can then bind and run the task like before
Also some usage of Sequence
:
var Sequence = require('parallel').Sequence,
fs = require('fs'),
path = require('path'),
sys = require('sys');
// Create a new sequence, pass in an array of funcions, or
// pass them as arguments
var task = new Sequence([
function (next) {
// First argument is always a function that gets called on completion
sys.puts('Hello world. We are starting!');
fs.readFile(__filename, next);
},
function (next, err, buffer) {
// The extra args gets suffixed onto the arguments
sys.puts('The size of this example is: ' + buffer.length);
// next.parallel is a variable you can pass which
// enables you to do multiple tasks at once.
// It should only be used in cases where the expected
// arguments passed to the callback are: error, result
fs.readdir(__dirname, next.parallel);
fs.readdir(path.join(__dirname, 'lib'), next.parallel);
}
]);
// You can also add tasks with the add method. This also opens
// up dynamic task creation as an option
task.add(function (next, err, results, first, second) {
// The returned arguments from a parallel sequence
// are as follows:
// * Callback for next task (as usual)
// * Error is there was one, otherwise will be null
// * All the results as an array in order
// * The result of the first task
// * Result of second task
// etc.
sys.puts('This dir had ' + results[0].length + ' items.');
sys.puts('The lib directory has ' + second.length + ' items.');
// You can either make the last changes here, or call next
// to run the callback passed to run(). You can pass arguments
// as usual.
next('Done.');
});
task.run(function (text) {
// The callback to run is optional, and only gets called if the last
// entry called next, or next.parallel.
// Only difference is that callback function will not be the first
// arguments.
sys.puts(text);
});