/promise-wtf

Lightweight Promise implementation with the 'finally' method

Primary LanguageJavaScriptMIT LicenseMIT

promise-wtf

Lightweight Promise implementation with the "finally" method

NPM Travis Coverage Status devDependency Status Known Vulnerabilities

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 provides the Promise constructor and 4 static methods:

Promise.series works as same as async.series but follows Promise style, for example:

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

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
});

CDN

Promise.min.js

Test

git clone https://github.com/ndaidong/promise-wtf.git
cd promise-wtf
npm install
npm test

License

The MIT License (MIT)