Skip to content

Instantly share code, notes, and snippets.

@petamoriken
Last active September 3, 2015 14:06
Show Gist options
  • Save petamoriken/7cad44c24c35972e8b1a to your computer and use it in GitHub Desktop.
Save petamoriken/7cad44c24c35972e8b1a to your computer and use it in GitHub Desktop.
自分ならこんな感じに書く Retmise.js
// 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