chainit
Turn an asynchronous JavaScript api into an asynchronous chainable JavaScript api.
usage
{}MyApiprototype {}MyApiprototype {} var chainit = ;var MyChainApi = ;var obj = ;obj // 1st call // 2nd call ; // 5th call
Adding or overriding methods
Adding and overriding methods works at both prototype level and instance level.
You must use chainit.add(chain, methodName, method)
,
you can't do direct assignation (chain.methodName = method
) because
object.observe
is not yet ready.
{}MyApiprototype {}MyApiprototype {} var chainit = ;var MyChainApi = ; var obj = ; // override instance methodchainit; obj // calls the newly added method1 ; // revert original methodchainit; // override prototype methodchainit; var obj2 = ; obj2; // calls the newly chained prototype `method1`
features
Features:
- supports async apis
- supports (crazy) nested calls
- supports static and prototype methods
- preserve nested calls order
- preserve context in cb()
- preserve cb(args)
- supports process.nextTick(cb)
- supports setTimeout(cb)
- supports methods redifinition
- supports adding new methods
- fully tested! local:
npm install -g mocha && mocha
, saucelabs:npm test
tests
See tests.
npm test
examples
See examples.
mixing async/sync apis
There is no easy way to mix sync/async chainable apis because there is no way to differenciate sync/async calls.
obj
We cannot know that syncMethod is synchronous and that we do not need to wait for a callback to be called to continue.
Either your api is fully asynchronous and every method takes a callback.
Either your api is fully synchronous.
If you want synchronous support, make a pull request
adding chainit.sync(Constructor)
.
credits
This module is using jessetane/queue.
A chainable api is queueing methods and reordering calls, so we use a queue.
This module was built to replace the chainable api from webdriverjs.