promise-wtf
Lightweight Promise implementation with the "finally" method
Why
Native Promise in ECMAScript 2015 came without "finally" while this method is really useful in many cases.
For an instance, let's start with the following script:
var Article = require('../models/Article');
export var home = (req, res) => {
let query = req.query || {};
let skip = query.skip || 0;
let limit = query.limit || 10;
let data = {
error: 0,
entries: []
};
I don't think that's good to write something like this:
return Article.list(skip, limit).then((result) => {
data.entries = result;
res.render('landing', data);
}).catch((err) => {
data.error = err;
res.render('landing', data);
});
};
However, it's better to have "finally" there:
return Article.list(skip, limit).then((result) => {
data.entries = result;
}).catch((err) => {
data.error = err;
}).finally(() => {
res.render('landing', data);
});
};
Unfortunately, "finally" is only available in some libraries such as Bluebird, or Q+, those are quite heavy to load for client side usage. What I need is just a basic prototype, a simple polyfill with "finally" implemented.
What's different?
This variant inherits the native Promise object's prototype if any. Otherwise, it provides Promise constructor and 3 static methods:
In addition, there is also Promise.series method that works as same as async.series but follows Promise style, for example:
var Promise = require('promise-wtf');
Promise.series([
(next) => {
setTimeout(next, 300);
},
(next) => {
setTimeout(next, 100);
},
(next) => {
setTimeout(next, 500);
},
(next) => {
setTimeout(next, 2000);
},
(next) => {
setTimeout(next, 1000);
}
]).then(() => {
console.log('Promise.series: then');
}).catch((err) => {
console.log('Promise.series: catch');
console.log(err);
}).finally(() => {
console.log('Promise.series: finally');
});
How
Test
git clone https://github.com/ndaidong/promise-wtf.git
cd promise-wtf
npm install
npm test
// run Promises/A+ Compliance Test Suite
npm run aplus
License
The MIT License (MIT)