A simple concurrency pattern: fan-in
JavaScript
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test
.gitignore
.travis.yml
LICENSE
Makefile
README.md
package.json

README.md

node-fanin Build Status

A simple concurrency pattern: fan-in

Status: Untested in production, but ready to be.

Why do you need fan-in?

  • You want to make n asynchronous calls simultaneously and make a callback when all have finished.
  • You may want to save the callback values of these calls, and definitely want the errors.
  • You just want that. Nothing else.

API

Usage:

var fanin = require('fanin')
  , fan = fanin(number_of_callbacks, final_callback);

asyncCall(fan); // repeat...
asyncCall(fan.capture('field'));
asyncCall(fan.ordered(index));
...
fan.timeout(err)


// final_callback( error_array, return_value_object );

Basic Usage (no return values, just an unorded list of errors):

var fan = fanin(2, cb);

foo(fan);
bar(fan);

function foo(cb) { cb(new Error('some error')); }

function bar(cb) { cb(null); }

// cb([ Error('some error') ]);

Storing return value(s):

var fan = fanin(2, cb);

foo(fan.capture('foo'));
bar(fan.capture('bar'));

function foo(cb) { cb(null, 'foobaz'); }

function bar(cb) { cb(null, 'bar', 'baz'); }

// cb(undefined, { foo: 'foobaz', bar: [ 'bar', 'baz' ] } );

Storing return values in an ordered array:

var fan = fanin(2, cb);

foo(fan.ordered(1));
bar(fan.ordered(0));

function foo(cb) { cb(null, 'foobaz'); }

function bar(cb) { cb(null, 'barbaz'); }

// cb(undefined, { ordered: [ 'barbaz', 'foobaz' ] } );

Timeouts on these calls:

var fan = fanin(2, cb);

fan.timeout(new Error('timeout!'));

// cb([ Error('timeout!') ])

Installation

npm install fanin

Tests

npm test

License

MIT License found in the LICENSE file.