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 _processWrappers(wrappers, value);
31 clearInterval(taskid);
33 taskid = setInterval(processAsyncOnce, 200);
38 /*****************************************************************************/
40 cloudeebus.PromiseResolver = function(promise) {
41 this.promise = promise;
47 cloudeebus.PromiseResolver.prototype.resolve = function(value, sync) {
51 var then = (value && value.then && value.then.apply) ? value.then : null;
54 var fulfillCallback = function(arg) {
55 self.resolve(arg, true);
57 var rejectCallback = function(arg) {
58 self.reject(arg, true);
61 then.apply(value, [fulfillCallback, rejectCallback]);
64 this.reject(cloudeebus.getError(e), true);
68 this.fulfill(value, sync);
72 cloudeebus.PromiseResolver.prototype.fulfill = function(value, sync) {
76 var promise = this.promise;
77 promise.state = "fulfilled";
78 promise.result = value;
82 _processWrappers(promise._fulfillWrappers, value);
84 _processWrappersAsync(promise._fulfillWrappers, value);
88 cloudeebus.PromiseResolver.prototype.reject = function(value, sync) {
92 var promise = this.promise;
93 promise.state = "rejected";
94 promise.result = value;
98 _processWrappers(promise._rejectWrappers, value);
100 _processWrappersAsync(promise._rejectWrappers, value);
105 /*****************************************************************************/
107 cloudeebus.Promise = function(init) {
108 this.state = "pending";
110 this._fulfillWrappers = [];
111 this._rejectWrappers = [];
112 this.resolver = new cloudeebus.PromiseResolver(this);
115 init.apply(this, [this.resolver]);
118 this.resolver.reject(cloudeebus.getError(e), true);
125 cloudeebus.Promise.prototype.appendWrappers = function(fulfillWrapper, rejectWrapper) {
127 this._fulfillWrappers.push(fulfillWrapper);
129 this._rejectWrappers.push(rejectWrapper);
130 if (this.state == "fulfilled")
131 _processWrappersAsync(this._fulfillWrappers, this.result);
132 if (this.state == "rejected")
133 _processWrappersAsync(this._rejectWrappers, this.result);
137 cloudeebus.Promise.prototype.then = function(fulfillCB, rejectCB) {
138 var promise = new cloudeebus.Promise();
139 var resolver = promise.resolver;
140 var fulfillWrapper, rejectWrapper;
143 fulfillWrapper = function(arg) {
145 var value = fulfillCB.apply(promise, [arg]);
146 resolver.resolve(value, true);
149 resolver.reject(cloudeebus.getError(e), true);
153 fulfillWrapper = function(arg) {
154 resolver.fulfill(arg, true);
158 rejectWrapper = function(arg) {
160 var value = rejectCB.apply(promise, [arg]);
161 resolver.resolve(value, true);
164 resolver.reject(cloudeebus.getError(e), true);
168 rejectWrapper = function(arg) {
169 resolver.reject(arg, true);
172 this.appendWrappers(fulfillWrapper,rejectWrapper);
177 cloudeebus.Promise.prototype["catch"] = function(rejectCB) {
178 return this.then(undefined,rejectCB);
182 cloudeebus.Promise.prototype.done = function(fulfillCB, rejectCB) {
183 this.appendWrappers(fulfillCB,rejectCB);
187 cloudeebus.Promise.resolve = function(value) {
188 var promise = new cloudeebus.Promise();
189 promise.resolver.resolve(value);
194 cloudeebus.Promise.fulfill = function(value) {
195 var promise = new cloudeebus.Promise();
196 promise.resolver.fulfill(value);
201 cloudeebus.Promise.reject = function(value) {
202 var promise = new cloudeebus.Promise();
203 promise.resolver.reject(value);
208 cloudeebus.Promise.any = function() {
209 var promise = new cloudeebus.Promise();
210 var resolver = promise.resolver;
211 var fulfillCallback = function(arg) {
212 resolver.resolve(arg, true);
214 var rejectCallback = function(arg) {
215 resolver.reject(arg, true);
217 if (arguments.length == 0)
218 resolver.resolve(undefined, true);
221 cloudeebus.Promise.resolve(arguments[i]).appendWrappers(fulfillCallback,rejectCallback);
226 cloudeebus.Promise.every = function() {
227 var promise = new cloudeebus.Promise();
228 var resolver = promise.resolver;
230 var countdown = arguments.length;
231 var args = new Array(countdown);
232 var rejectCallback = function(arg) {
233 resolver.reject(arg, true);
235 if (arguments.length == 0)
236 resolver.resolve(undefined, true);
238 for (i in arguments) {
239 var fulfillCallback = function(arg) {
243 resolver.resolve(args, true);
246 cloudeebus.Promise.resolve(arguments[i]).appendWrappers(fulfillCallback,rejectCallback);
253 cloudeebus.Promise.some = function() {
254 var promise = new cloudeebus.Promise();
255 var resolver = promise.resolver;
257 var countdown = arguments.length;
258 var args = new Array(countdown);
259 var fulfillCallback = function(arg) {
260 resolver.resolve(arg, true);
262 if (arguments.length == 0)
263 resolver.resolve(undefined, true);
265 for (i in arguments) {
266 var rejectCallback = function(arg) {
270 resolver.reject(args, true);
273 cloudeebus.Promise.resolve(arguments[i]).appendWrappers(fulfillCallback,rejectCallback);