asynchrony

Auto unwrap promise parameters for clean asynchronous code


Keywords
async, promises
License
GPL-3.0+
Install
npm install asynchrony@0.1.1

Documentation

asynchrony

Asynchrony is a tiny function that unwraps Promises passed as arguments to functions. Doing so saves you from "then hell", which is like callback hell, but slightly hotter. This project is not a joke. Really.

Examples below to see how you can use asynchrony.

Installation

npm install asynchrony

Comparison with Promises Code

Code with asynchrony. See how functions are wrapped in asynchrony.

var asynchrony = require('asynchrony');

//Get tweets for a handle
var getTweetsFor = asynchrony(function(name) {
    return new Promise(function(resolve, reject) {
        if (name === "jeswin") {
            setTimeout(function() {
                resolve(["Tweet1:t.co/666", "Tweet2:t.co/667"]);
            }, 500);
        } else {
            reject("Unknown user");
        }
    });
});

//Find urls in a tweet
var parseTweetsForUrls = asynchrony(function(tweets) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            var urls = tweets.map(function(tweet) {
                return tweet.split(":")[1];
            });
            resolve(urls);
        }, 100);
    });
});

//Expand a url using twitters api
var expandUrlUsingTwitterApi = asynchrony(function(url) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve("example.com/" + url);
        }, 100);
    });
});

//fetch via http
var httpGet = asynchrony(function(url) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve("Lorem ipsum dolor....");
        }, 100);
    });
});

//Look ma, not many then()s!
var tweets = getTweetsFor("jeswin");
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = asynchrony(function(shortUrls) {
    var mostRecentShortUrl = shortUrls[0];
    return expandUrlUsingTwitterApi(mostRecentShortUrl);
})(shortUrls);

var responseBody = httpGet(mostRecentShortUrl);
responseBody.then(function(resp) {
    console.log(resp);
});

Code without asynchrony.

/*
    Example taken from https://blog.domenic.me/youre-missing-the-point-of-promises/
    Implementation of getTweetsFor(), parseTweetsForUrls() etc removed for brevity
*/

getTweetsFor("domenic")
    .then(function (tweets) {
        var shortUrls = parseTweetsForUrls(tweets);
        var mostRecentShortUrl = shortUrls[0];
        return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning function
    })
    .then(httpGet) // promise-returning function
    .then(
        function (responseBody) {
            console.log("Most recent link text:", responseBody);
        },
        function (error) {
            console.error("Error with the twitterverse:", error);
        }
    );