Promises in POJS

Example on how to implement promises pattern

by dpecos

HTML

<div id="logs"></div>

JavaScript

function Promise(promise) {
    if (promise instanceof Promise) {
        return promise;
    } else {
        // this is a new promise chain
        this.callbacks = [];
    }
}

Promise.prototype.then = function(callback_ok, callback_error) {
    this.callbacks.push({
        ok: callback_ok,
        error: callback_error
    });
    return this;
};

Promise.prototype.resolve = function() {
    var callback = this.callbacks.shift();
    if (callback && callback.ok) {
        callback.ok.apply(this, arguments);
    }
};

Promise.prototype.reject = function() {
    var callback = this.callbacks.shift();
    if (callback && callback.error) {
        callback.error.apply(this, arguments);
    }
};

// ----- Helper functions -----
function log_i(msg) {
    var e = document.createElement('div');
    e.innerHTML = msg;
    document.getElementById('logs').appendChild(e);
}

function log_e(msg) {
    log_i("Error: " + msg);
}

// ----- Our dummy busines operations functions -----
function operation(value) {
    var promise = new Promise(this);
    setTimeout(function() {
        promise.resolve(value + 1);
    }, 100);
    return promise;
};

var operation1 = operation;
var operation2 = operation;
var operation3 = operation;

var failingOoperation2 = function(value) {
    var promise = new Promise(this); // passing "this" allows to chain promises
    setTimeout(function() {
        promise.reject("Ups!");
    }, 300);
    return promise;
};

// ----- Chained promises examples -----
operation1(0).then(failingOoperation2).then(operation3, log_e).then(log_i);
operation1(0).then(operation2).then(operation3).then(log_i);