michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: /** michael@0: * THIS MODULE IS DEPRECATED. IMPORT "Promise.jsm" INSTEAD. michael@0: */ michael@0: michael@0: "use strict"; michael@0: michael@0: this.Promise = {}; michael@0: michael@0: if (typeof(require) === "function") { michael@0: module.exports = Promise; michael@0: } else { michael@0: this.EXPORTED_SYMBOLS = ["Promise"]; michael@0: } michael@0: michael@0: function fulfilled(value) { michael@0: return { then: function then(fulfill) { fulfill(value); } }; michael@0: } michael@0: michael@0: function rejected(reason) { michael@0: return { then: function then(fulfill, reject) { reject(reason); } }; michael@0: } michael@0: michael@0: function isPromise(value) { michael@0: return value && typeof(value.then) === 'function'; michael@0: } michael@0: michael@0: function defer() { michael@0: var observers = []; michael@0: var result = null; michael@0: var promise = { michael@0: then: function then(onFulfill, onError) { michael@0: var deferred = defer(); michael@0: michael@0: function resolve(value) { michael@0: try { michael@0: deferred.resolve(onFulfill ? onFulfill(value) : value); michael@0: } catch (error) { michael@0: deferred.resolve(rejected(error)); michael@0: } michael@0: } michael@0: michael@0: function reject(reason) { michael@0: try { michael@0: if (onError) deferred.resolve(onError(reason)); michael@0: else deferred.resolve(rejected(reason)); michael@0: } catch (error) { michael@0: deferred.resolve(rejected(error)); michael@0: } michael@0: } michael@0: michael@0: if (observers) { michael@0: observers.push({ resolve: resolve, reject: reject }); michael@0: } else { michael@0: result.then(resolve, reject); michael@0: } michael@0: michael@0: return deferred.promise; michael@0: } michael@0: }; michael@0: michael@0: var deferred = { michael@0: promise: promise, michael@0: resolve: function resolve(value) { michael@0: if (!result) { michael@0: result = isPromise(value) ? value : fulfilled(value); michael@0: while (observers.length) { michael@0: var observer = observers.shift(); michael@0: result.then(observer.resolve, observer.reject); michael@0: } michael@0: observers = null; michael@0: } michael@0: }, michael@0: reject: function reject(reason) { michael@0: deferred.resolve(rejected(reason)); michael@0: } michael@0: }; michael@0: michael@0: return deferred; michael@0: } michael@0: Promise.defer = defer; michael@0: michael@0: function resolve(value) { michael@0: var deferred = defer(); michael@0: deferred.resolve(value); michael@0: return deferred.promise; michael@0: } michael@0: Promise.resolve = resolve; michael@0: michael@0: function reject(reason) { michael@0: var deferred = defer(); michael@0: deferred.reject(reason); michael@0: return deferred.promise; michael@0: } michael@0: Promise.reject = reject; michael@0: michael@0: var promised = (function() { michael@0: var call = Function.call; michael@0: var concat = Array.prototype.concat; michael@0: function execute(args) { return call.apply(call, args) } michael@0: function promisedConcat(promises, unknown) { michael@0: return promises.then(function(values) { michael@0: return resolve(unknown).then(function(value) { michael@0: return values.concat([ value ]); michael@0: }); michael@0: }); michael@0: } michael@0: return function promised(f) { michael@0: return function promised() { michael@0: return concat.apply([ f, this ], arguments). michael@0: reduce(promisedConcat, resolve([])). michael@0: then(execute); michael@0: }; michael@0: } michael@0: })(); michael@0: Promise.all = promised(Array);