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