Edit in JSFiddle

(function () {
    "use strict";
    var deferred = function (success, fail) {
        var resolve, reject;

        var p = new Promise(function (_resolve, _reject) {
            /* 
             * 外からresolveさせたり、rejectさせるために
             * 外側の変数に_resolve, _rejectを渡す
             * (p.resolve()のように外から普通にresolveすることはできない。)
             */
            resolve = _resolve;
            reject = _reject;
        });

        // 通信成功時・失敗時の挙動を指定
        var promise = p.then(success, fail);

        // 外部からthen()、resolve(), reject()できるように公開
        return {
            promise: promise,
            resolve: resolve,
            reject: reject
        };
    };

    var ok_response = {
        ok: true,
        status: 200,
        text: JSON.stringify({
            foo: "bar"
        })
    };
    
    var ng_response = {
        ok: false,
        status: 404,
        text: ""
    };

    var callback = function (response) {
        console.log(response.status);
    };

    var d = deferred(function () {
        callback(ok_response);
    }, function () {
        callback(ng_response);
    });

    d.resolve();
})();