return 33
}).then(function(thiryThree){ // Values get passed down the chain. Simple right? // Now lets return a promise instead of a value
return testPromise(99)
}).then(function(ninetyNine){ // The inner promise was resolved asynchronously, and its value passed in // If you've ever used the async library, it's akin to a waterfall // Finally, one last mind bending trick
return [testPromise(11), testPromise(33), testPromise(55)]
}).all().then(function(list){ // list === [11, 33, 55] // Yeah, try doing that with async (obviously you could, but it would look hideous) // and just because we can return list }).spread(function(eleven, thirtyThree, fiftyFive){ // There you go, now you have a general idea of how promises work // To asnwer the original question, a promise is just a special deferred object
// .done() makes sure that if any errors occured durring execution, they get thrown
}).done()
// alternatively, catch errors with the fail
function
// .fail(function(err){ })
## Building your own promises with Promiz
Promiz has many helper functions to help you convert regular functions into promises
#### Promiz.defer()
```javascript
function testPromise(val) {
// create a new instance of a deffered object (a `promise`)
var deferred = Promiz.defer()
setTimeout(function(){
if (val === 42) {
deferred.resolve('correct')
} else {
// This throws an error, which can be caught by .catch() or .done()
deferred.reject(new Error('incorrect input'))
}
}, 0)
return deferred
}
testPromise(42).then()
function testFn(val){
if (val === 42){
return 'correct'
}
throw new Error('incorrect input')
}
Promiz.fcall(testFn, 42).then()
function nodeFn(val, callback) {
if (val === 42) {
return callback(null, 'correct')
}
return callback(new Error('incorrect input'))
}
Promiz.nfcall(nodeFn, 42).then()
// .then() takes an optional second error handler, which will catch all errors from previous calls
// including the current success call
promise.then(function success(){}, function error(){})
// .spread() calls .all() and then `applys` over the target function
promise.then(function(){ return [promise(), promise()] }).spread(function(one, two){ })
// resolves all promises in the result array
promise
.then(function(){ return [promise(), promise()] })
.all() // all()
.then(function(list){ /* all promises have been resolved */})
// catches any errors that have been thrown thus far
promise.then(function(){ throw new Error('hello') }).fail(function(err){ })
// If any errors have not been caught by this point, throw them.
// This ends the promise chain
promise.done()
// Sometimes you may need to support both promises and callbacks
// (eg. a developer on your team doesn't know promises)
// This function allowes you to create dual functions, that can act like both
function dualFunction(/* optional callback */ callback){
return promise.nodeify(callback)
}
// you can use it as a promise function
dualFunction().then()
// or a node-style callback function
dualFunction(function(err, val){ })
- The promise chain will try to run syncronoously if possible (technically this breaks spec, but it's much faster and so worth it)
- .then() runs as fast async.series() in micro benchmarks (see bench.js)
- It's also faster than the Q promise library by about ~6x in micro benchmarks (see bench.js)