dush-promise
Version:
Plugin for `dush` that makes it a Deferred promise and adds `.resolve`, `.reject`, `.than` and `.catch` methods for more better error handling experience
156 lines (141 loc) • 3.59 kB
JavaScript
/*!
* dush-promise <https://github.com/tunnckoCore/dush-promise>
*
* Copyright (c) Charlike Mike Reagent <@tunnckoCore> (https://i.am.charlike.online)
* Released under the MIT license.
*/
var extend = require('extend-shallow')
var Deferred = require('native-promise-deferred')
/**
* > Adds a Promise methods such as `.resolve`, `.reject`
* `.then` and `.catch` to your [dush][] application. Useful
* from inside plugins. This plugin also emits `error` event
* when `app.reject` is used.
*
* **Example**
*
* ```js
* var dush = require('dush')
* var promise = require('dush-promise')
*
* var app = dush().use(promise())
*
* console.log(app.then)
* console.log(app.catch)
* console.log(app.reject)
* console.log(app.resolve)
* ```
*
* @param {Object} `opts` optional, passed directly to [native-promise-deferred][]
* @return {Function} a plugin function that should be passed to `.use` method of [dush][]
* @api public
*/
module.exports = function dushPromise (opts) {
return function dushPromise_ (app) {
var promise = Deferred(extend({}, app.options, opts))
/**
* > Handle resolved promise with `onresolved` or rejected promise
* with `onrejected`. It is as any usual Promise `.then` method.
*
* **Example**
*
* ```js
* app.then((res) => {
* console.log(res) // => 123
* })
* app.resolve(123)
*
* // or handle rejected promise
* app.then(null, (er) => {
* console.log('err!', er) // => Error: foo bar
* })
* app.reject(new Error('foo bar'))
* ```
*
* @name .then
* @param {Function} `onresolved`
* @param {Function} `onrejected`
* @return {Promise}
* @api public
*/
app.then = function then (onresolved, onrejected) {
return promise.then(onresolved, onrejected)
}
/**
* > Catch a rejected promise error. This method is mirror
* of any usual promise `.catch` method.
*
* **Example**
*
* ```js
* app.on('error', (err) => {
* console.log('er!', err) // => Error: sad err
* })
* app.catch((err) => {
* console.log('oops, error!', err) // => Error: sad err
* })
*
* app.reject(new Error('sad err'))
* ```
*
* @name .catch
* @param {Function} `onrejected`
* @return {Promise}
* @api public
*/
app.catch = function catch_ (onrejected) {
return promise.catch(onrejected)
}
/**
* > As any usual `Promise.resolve` method.
*
* **Example**
*
* ```js
* app.use((app) => {
* app.foo = () => {
* return app.resolve(1222)
* }
* })
*
* const promise = app.foo()
* promise.then((val) => {
* console.log('res:', val) // => 1222
* })
* ```
*
* @name .resolve
* @param {any} `val`
* @return {Promise}
* @api public
*/
app.resolve = function resolve (val) {
return promise.resolve(val)
}
/**
* > As any usual `Promise.reject` method.
*
* **Example**
*
* ```js
* app.on('error', (err) => {
* console.log('some error:', err) // => Error: quxie
* })
* app.reject(new Error('quxie'))
* ```
*
* @name .reject
* @param {Error} `err`
* @return {Promise}
* @api public
*/
app.reject = function reject (err) {
return promise.reject(err)
}
app.catch(function onRejected (er) {
app.emit('error', er)
})
return app
}
}