You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.1 KiB
122 lines
3.1 KiB
/* |
|
* Spreed WebRTC. |
|
* Copyright (C) 2013-2015 struktur AG |
|
* |
|
* This file is part of Spreed WebRTC. |
|
* |
|
* This program is free software: you can redistribute it and/or modify |
|
* it under the terms of the GNU Affero General Public License as published by |
|
* the Free Software Foundation, either version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU Affero General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU Affero General Public License |
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
* |
|
*/ |
|
|
|
"use strict"; |
|
define(['underscore'], function(_) { |
|
|
|
// Helper class to kill of old defers. |
|
var Caller = function(ref) { |
|
this.ref = ref; |
|
}; |
|
Caller.prototype.disable = function() { |
|
this.ref = null; |
|
} |
|
Caller.prototype.resolve = function(value) { |
|
if (this.ref) { |
|
_.bind(this.ref.resolve, this.ref)(value); |
|
} |
|
}; |
|
Caller.prototype.reject = function(reason) { |
|
if (this.ref) { |
|
_.bind(this.ref.reject, this.ref)(reason); |
|
} |
|
}; |
|
Caller.prototype.notify = function(value) { |
|
if (this.ref) { |
|
_.bind(this.ref.notify, this.ref)(value); |
|
} |
|
}; |
|
|
|
// continueConnector |
|
return ["$q", function($q) { |
|
|
|
var ContinueConnector = function() { |
|
this.deferred = $q.defer(); |
|
this.promises = []; |
|
this.thens = []; |
|
this.current = null; |
|
}; |
|
|
|
ContinueConnector.prototype.add = function(promise) { |
|
|
|
this.promises.push(promise); |
|
this.refresh(); |
|
|
|
}; |
|
|
|
ContinueConnector.prototype.remove = function(promise) { |
|
|
|
this.promises = _.without(this.promises, promise); |
|
this.refresh(); |
|
|
|
}; |
|
|
|
ContinueConnector.prototype.refresh = function() { |
|
|
|
// Disable old ones. |
|
if (this.current) { |
|
this.current.disable(); |
|
} |
|
// Prepare caller. |
|
var current = this.current = new Caller(this); |
|
// Create new promise for all registered promises. |
|
var all = $q.all(this.promises); |
|
all.then(_.bind(current.resolve, current), _.bind(current.reject, current), _.bind(current.notify, current)); |
|
}; |
|
|
|
ContinueConnector.prototype.defer = function() { |
|
var deferred = $q.defer(); |
|
this.add(deferred.promise); |
|
return deferred; |
|
}; |
|
|
|
ContinueConnector.prototype.resolve = function(value) { |
|
//console.log("Continue connector resolved", arguments); |
|
this.deferred.resolve(value); |
|
}; |
|
|
|
ContinueConnector.prototype.reject = function(reason) { |
|
this.deferred.reject(reason); |
|
}; |
|
|
|
ContinueConnector.prototype.notify = function(value) { |
|
this.deferred.notify(value); |
|
}; |
|
|
|
ContinueConnector.prototype.then = function(successCallback, errorCallback, notifyCallback) { |
|
this.thens.push(arguments); |
|
return this.deferred.promise.then(successCallback, errorCallback, notifyCallback); |
|
}; |
|
|
|
ContinueConnector.prototype.reset = function() { |
|
this.deferred = $q.defer(); |
|
var p = this.deferred.promise; |
|
_.each(this.thens, function(args) { |
|
p.then.apply(p, args); |
|
}); |
|
this.refresh(); |
|
}; |
|
|
|
return new ContinueConnector(); |
|
|
|
}]; |
|
|
|
});
|
|
|