UNPKG

continue

Version:

Compose chainable async methods

202 lines (143 loc) 4.5 kB
# continue Compose chainable async methods. ## Install ``` npm install continue --save ``` ## Usage ```js var Continue = require('continue'); var chain = Continue(); var async = require('async'); // <~~ simply for usage example // Add methods to our chain sequence chain.add('map', function (items, iterator, next) { async.map(items, iterator, next); }); chain.add('sortBy', function (items, iterator, next) { async.sortBy(items, iterator, next); }); chain.add('filter', function (items, iterator, next) { var self = this; var error; async.filter(items, function (item, callback) { iterator(item, function (err, matched) { if (err) { error = err; return; } callback(matched); }); }, function (filteredItems) { next(error, filteredItems); }); }); // Use our chain var list = [ { name: 'John', age: 25 }, { name: 'Jane', age: 20 } ]; chain(list) .sortBy(function (item, next) { next(null, item.age); }) .map(function (item, next) { next(null, item.age); }) .then(function (items) { // items now equals: [20, 25] }, function () { // oops, an error may have occured }); ``` ## chain The instance value returned from calling `Continue()` is both a function and an object. The object is the instance and the function returns the chain sequence. `chain()` supports the follow as initial values to start the chain: * **Primitive** - strings, numbers, etc. * **Array** - an array of primitives or objects * **Function** - a function that is passed a `next` callback that must be called with the following: `next(err, value)`. The value passed as the second argument becomes the initial value of the chain. ###For example: **Primitive** ```js var Continue = require('continue'); var chain = Continue(); var someValue = 'my value'; chain(someValue); ``` **Array** ```js var Continue = require('continue'); var chain = Continue(); var someValue = [1,2,3,4,5]; chain(someValue); ``` **Function** ```js var Continue = require('continue'); var chain = Continue(); chain(function (next) { var someValue = 'my value'; next(null, someValue); }); ``` ## instance methods These methods are available on the `chain` variable. ### add(methodName, methodTask) Composes a chainable method on the chain. The method is added for all instances of that particular chain. **methodName** A string that will be used as the method name **methodTask** A callback function that is passed the following parameters * `items` - any value that you would like passed to the first method in the chain * `iterator` - the method called on the value from the previous method that performs some sort of user defined operation * `next` - the callback once all items in the list or collection have been processed. #### For Example: ```js var Continue = require('continue'); var chain = Continue(); // Add methods to our chain sequence chain.add('map', function (items, iterator, next) { iterator(items, function (err, processItems) { next(err, processItems); }); }); ``` ## chain sequence methods These methods are available on the value returned from called `chain(someValue)` The methods available vary according to which methods have been added to the chain. In the usage example above, we've added `map`, `sortBy`, and `filter`. These methods would be available on the chain as well as: ### then(successCallback, errorCallback) Each chain sequence returns a promise. Refer to the [Promises/A+](http://promises-aplus.github.io/promises-spec/) spec for more details. **successCallback** This is called once all chained methods have processed the initial value, unless an error has occurred. **errorCallback** This is called if an error occurs anywhere when processing the initial value in any of the chainable methods. If an error occurs, all processing stops. #### For Example: ```js var Continue = require('continue'); var chain = Continue(); var someValue = 'my value'; chain(someValue) .someChainableMethod(function (value, next) { next(null, value + 's'); }) .then(function (processedValue) { // processedValue == my values }); ``` ### drain() Runs each method in the chain b draining the chain queue on next tick. ## TODO * more detailed documentation * allow callbacks on each chained method * allow promises to be passed in as inititial value to chain * **Continue** module examples ## Run Tests ``` npm install npm test ```