1 /******************************************************************************
2 * Copyright 2012 - 2013 Intel Corporation.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
19 /*****************************************************************************/
21 function _processWrappers(wrappers, value) {
22 for (var i=0; i<wrappers.length; i++)
27 function _processWrappersAsync(wrappers, value) {
29 function processAsyncOnce() {
30 if (!wrappers.processed)
31 _processWrappers(wrappers, value);
32 clearInterval(taskid);
33 wrappers.processed = true;
35 taskid = setInterval(processAsyncOnce, 200);
40 /*****************************************************************************/
42 cloudeebus.PromiseResolver = function(promise) {
43 this.promise = promise;
49 cloudeebus.PromiseResolver.prototype.resolve = function(value, sync) {
53 var then = (value && value.then && value.then.apply) ? value.then : null;
56 var fulfillCallback = function(arg) {
57 self.resolve(arg, true);
59 var rejectCallback = function(arg) {
60 self.reject(arg, true);
63 then.apply(value, [fulfillCallback, rejectCallback]);
66 this.reject(cloudeebus.getError(e), true);
70 this.fulfill(value, sync);
74 cloudeebus.PromiseResolver.prototype.fulfill = function(value, sync) {
78 var promise = this.promise;
79 promise.state = "fulfilled";
80 promise.result = value;
84 _processWrappers(promise._fulfillWrappers, value);
86 _processWrappersAsync(promise._fulfillWrappers, value);
90 cloudeebus.PromiseResolver.prototype.reject = function(value, sync) {
94 var promise = this.promise;
95 promise.state = "rejected";
96 promise.result = value;
100 _processWrappers(promise._rejectWrappers, value);
102 _processWrappersAsync(promise._rejectWrappers, value);
107 /*****************************************************************************/
109 cloudeebus.Promise = function(init) {
110 this.state = "pending";
112 this._fulfillWrappers = [];
113 this._rejectWrappers = [];
114 this.resolver = new cloudeebus.PromiseResolver(this);
117 init.apply(this, [this.resolver]);
120 this.resolver.reject(cloudeebus.getError(e), true);
127 cloudeebus.Promise.prototype.appendWrappers = function(fulfillWrapper, rejectWrapper) {
129 this._fulfillWrappers.push(fulfillWrapper);
131 this._rejectWrappers.push(rejectWrapper);
132 if (this.state == "fulfilled")
133 _processWrappersAsync(this._fulfillWrappers, this.result);
134 if (this.state == "rejected")
135 _processWrappersAsync(this._rejectWrappers, this.result);
139 cloudeebus.Promise.prototype.then = function(fulfillCB, rejectCB) {
140 var promise = new cloudeebus.Promise();
141 var resolver = promise.resolver;
142 var fulfillWrapper, rejectWrapper;
145 fulfillWrapper = function(arg) {
147 var value = fulfillCB.apply(promise, [arg]);
148 resolver.resolve(value, true);
151 resolver.reject(cloudeebus.getError(e), true);
155 fulfillWrapper = function(arg) {
156 resolver.fulfill(arg, true);
160 rejectWrapper = function(arg) {
162 var value = rejectCB.apply(promise, [arg]);
163 resolver.resolve(value, true);
166 resolver.reject(cloudeebus.getError(e), true);
170 rejectWrapper = function(arg) {
171 resolver.reject(arg, true);
174 this.appendWrappers(fulfillWrapper,rejectWrapper);
179 cloudeebus.Promise.prototype["catch"] = function(rejectCB) {
180 return this.then(undefined,rejectCB);
184 cloudeebus.Promise.prototype.done = function(fulfillCB, rejectCB) {
185 this.appendWrappers(fulfillCB,rejectCB);
189 cloudeebus.Promise.resolve = function(value) {
190 var promise = new cloudeebus.Promise();
191 promise.resolver.resolve(value);
196 cloudeebus.Promise.fulfill = function(value) {
197 var promise = new cloudeebus.Promise();
198 promise.resolver.fulfill(value);
203 cloudeebus.Promise.reject = function(value) {
204 var promise = new cloudeebus.Promise();
205 promise.resolver.reject(value);
210 cloudeebus.Promise.any = function() {
211 var promise = new cloudeebus.Promise();
212 var resolver = promise.resolver;
213 var fulfillCallback = function(arg) {
214 resolver.resolve(arg, true);
216 var rejectCallback = function(arg) {
217 resolver.reject(arg, true);
219 if (arguments.length == 0)
220 resolver.resolve(undefined, true);
223 cloudeebus.Promise.resolve(arguments[i]).appendWrappers(fulfillCallback,rejectCallback);
228 cloudeebus.Promise.every = function() {
229 var promise = new cloudeebus.Promise();
230 var resolver = promise.resolver;
232 var countdown = arguments.length;
233 var args = new Array(countdown);
234 var rejectCallback = function(arg) {
235 resolver.reject(arg, true);
237 if (arguments.length == 0)
238 resolver.resolve(undefined, true);
240 for (i in arguments) {
241 var fulfillCallback = function(arg) {
245 resolver.resolve(args, true);
248 cloudeebus.Promise.resolve(arguments[i]).appendWrappers(fulfillCallback,rejectCallback);
255 cloudeebus.Promise.some = function() {
256 var promise = new cloudeebus.Promise();
257 var resolver = promise.resolver;
259 var countdown = arguments.length;
260 var args = new Array(countdown);
261 var fulfillCallback = function(arg) {
262 resolver.resolve(arg, true);
264 if (arguments.length == 0)
265 resolver.resolve(undefined, true);
267 for (i in arguments) {
268 var rejectCallback = function(arg) {
272 resolver.reject(args, true);
275 cloudeebus.Promise.resolve(arguments[i]).appendWrappers(fulfillCallback,rejectCallback);