diff options
Diffstat (limited to 'devtools/shared/deprecated-sync-thenables.js')
-rw-r--r-- | devtools/shared/deprecated-sync-thenables.js | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/devtools/shared/deprecated-sync-thenables.js b/devtools/shared/deprecated-sync-thenables.js new file mode 100644 index 000000000..52bf671cd --- /dev/null +++ b/devtools/shared/deprecated-sync-thenables.js @@ -0,0 +1,119 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * THIS MODULE IS DEPRECATED. IMPORT "Promise.jsm" INSTEAD. + */ + +"use strict"; + +this.Promise = {}; + +if (typeof (require) === "function") { + module.exports = Promise; +} else { + this.EXPORTED_SYMBOLS = ["Promise"]; +} + +function fulfilled(value) { + return { then: function then(fulfill) { fulfill(value); } }; +} + +function rejected(reason) { + return { then: function then(fulfill, reject) { reject(reason); } }; +} + +function isPromise(value) { + return value && typeof (value.then) === "function"; +} + +function defer() { + var observers = []; + var result = null; + var promise = { + then: function then(onFulfill, onError) { + var deferred = defer(); + + function resolve(value) { + try { + deferred.resolve(onFulfill ? onFulfill(value) : value); + } catch (error) { + deferred.resolve(rejected(error)); + } + } + + function reject(reason) { + try { + if (onError) deferred.resolve(onError(reason)); + else deferred.resolve(rejected(reason)); + } catch (error) { + deferred.resolve(rejected(error)); + } + } + + if (observers) { + observers.push({ resolve: resolve, reject: reject }); + } else { + result.then(resolve, reject); + } + + return deferred.promise; + } + }; + + var deferred = { + promise: promise, + resolve: function resolve(value) { + if (!result) { + result = isPromise(value) ? value : fulfilled(value); + while (observers.length) { + var observer = observers.shift(); + result.then(observer.resolve, observer.reject); + } + observers = null; + } + }, + reject: function reject(reason) { + deferred.resolve(rejected(reason)); + } + }; + + return deferred; +} +Promise.defer = defer; + +function resolve(value) { + var deferred = defer(); + deferred.resolve(value); + return deferred.promise; +} +Promise.resolve = resolve; + +function reject(reason) { + var deferred = defer(); + deferred.reject(reason); + return deferred.promise; +} +Promise.reject = reject; + +var promised = (function () { + var call = Function.call; + var concat = Array.prototype.concat; + function execute(args) { return call.apply(call, args); } + function promisedConcat(promises, unknown) { + return promises.then(function (values) { + return resolve(unknown).then(function (value) { + return values.concat([ value ]); + }); + }); + } + return function promised(f) { + return function promised() { + return concat.apply([ f, this ], arguments). + reduce(promisedConcat, resolve([])). + then(execute); + }; + }; +})(); +Promise.all = promised(Array); |