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.
With "finally", something like this can be avoided:
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: []
};
return Article.list(skip, limit).then((result) => {
data.entries = result;
res.render('landing', data);
}).catch((err) => {
data.error = err;
res.render('landing', data);
});
};
And replaced with something like this:
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: []
};
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 jus a basic prototype, simple polyfill with "finally" implemented.
How
In node.js
npm install promise-wtf
And then:
var fs = require('fs');
var Promise = require('promise-wtf');
var read = (file) => {
return new Promise((resolve, reject) => {
fs.readFile(file, 'utf8', (err, content) => {
if (err) {
return reject(err);
}
return resolve(content);
});
});
};
read('./hello.txt').then((a) => {
a += 'I like Promise';
return a;
}).then((b) => {
b += '\nI need finally';
return b;
}).then((c) => {
console.log(c);
}).catch((err) => {
console.log(err);
}).finally(() => {
console.log('Done');
});
Ouput:
Hello
I like Promise
I need finally
Done
Using SystemJS
System.config({
baseURL: '/path/to/promise-wtf.js/folder',
map: {
promise: 'promise-wtf'
}
});
System.import('promise').then(function(Promise){
// use Promise here
});
Using RequireJS
require.config({
baseUrl: '/path/to/promise-wtf.js/folder',
paths: {
promise: 'promise-wtf'
}
});
requirejs('promise', function(Promise){
// use Promise here
});
Test
git clone https://github.com/ndaidong/promise-wtf.git
cd promise-wtf
npm install
npm test
License
The MIT License (MIT)