Last active
September 3, 2015 14:06
-
-
Save petamoriken/7cad44c24c35972e8b1a to your computer and use it in GitHub Desktop.
自分ならこんな感じに書く Retmise.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://qiita.com/mpyw/items/b7192d3aadf90d55ad49 | |
(function (root) { | |
"use strict"; | |
// 単純に constructor を外に出してみた。こっちの方が好み。 | |
function Retmise(options) { | |
if (this.constructor !== Retmise) { | |
return new Retmise(options); | |
} | |
// this からオブジェクトを参照するとちょっと遅くなりそう。最後に this.options に代入する。 | |
options = options || {}; | |
options.retries = options.retries != null ? options.retries : 5; | |
options.delay = options.delay != null ? options.delay : 500; | |
options.timeout = options.timeout != null ? options.timeout : 0; | |
options.onRetry = typeof options.onRetry === 'function' | |
? options.onRetry : doNothing; // doNothing !!! | |
this.options = options; | |
} | |
Retmise.prototype.do = function (callback) { | |
var _this = this; | |
var count = 0; | |
return new Promise(function (resolve, reject) { | |
(function self() { | |
new Promise(callback).then(function (result) { | |
resolve(result); | |
}, function (reason) { | |
if (count++ < _this.options.retries || _this.options.retries < 0) { | |
setTimeout(function () { | |
_this.options.onRetry(count); | |
self(); | |
}, _this.options.delay); | |
} else { | |
reject(reason); | |
} | |
}); | |
})(); | |
if (_this.options.timeout > 0) { | |
setTimeout(reject, _this.options.timeout, 'timeout'); | |
} | |
}); | |
}; | |
// これを使うと Retmise コンストラクタを実行する度に、何もしない函数をつくらなくて済む。 | |
function doNothing() {} | |
// JavaScript で存在しない変数を単に参照するとエラーを吐き出す。typeof を使うべき。 | |
// あるオブジェクトにプロパティが存在するかどうかなら typeof を使わなくていい e.g) window.module | |
// ただ Browserify だとかで出力すると window.module が存在しないけど module という変数がこのクロージャーに存在するかのように出力されるからやっぱり typeof を使うべき。 | |
if (typeof module !== "undefined" && module.exports) { | |
module.exports = Retmise; | |
} else { | |
root.Retmise = Retmise; | |
} | |
// 単純に this だけだったら Browser でしか動かない。こんな感じで書くと Browser と Node.js と WebWorker でグローバル変数が取れる。 | |
})( (this || 0).self || global ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment