Skip to content

Instantly share code, notes, and snippets.

@liady
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save liady/2765d5fe9bcd4227749a to your computer and use it in GitHub Desktop.
Save liady/2765d5fe9bcd4227749a to your computer and use it in GitHub Desktop.
function Lockable() {
this.deferred = $.Deferred();
this.locks = {};
}
Lockable.prototype.lock = function (lockName) {
this.locks[lockName] = true;
return this;
}
Lockable.prototype.unlock = function (lockName) {
delete this.locks[lockName];
if (!this.hasLocks()) {
this.deferred.resolve();
this.reset();
}
return this;
}
Lockable.prototype.seal = function (errorMessage) {
this.deferred.reject(errorMessage);
this.locks[".seal"] = true;
return this;
}
Lockable.prototype.onOpen = function (successCallback) {
successCallback && this.deferred.done(successCallback);
if (!this.hasLocks()) {
this.deferred.resolve();
this.reset();
}
return this;
}
Lockable.prototype.onSeal = function (failCallback){
failCallback && this.deferred.fail(failCallback);
return this;
}
Lockable.prototype.reset = function (){
this.deferred = $.Deferred();
this.locks = {};
return this;
}
Lockable.prototype.hasLocks = function () {
return !!Object.keys(this.locks).length;
}
Lockable.prototype.status = function () {
var self = this;
return {
isOpen : !self.hasLocks(),
isSealed : !!self.locks[".seal"],
locks : Object.keys(self.locks)
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment