|
17 | 17 |
|
18 | 18 | isFunction: function (f) {
|
19 | 19 | return Object.prototype.toString.call(f) === "[object Function]";
|
20 |
| - }, |
21 |
| - |
22 |
| - extend: function (target, source) { |
23 |
| - for (var x in source) { if (source.hasOwnProperty(x)) { target[x] = source[x]; } } |
24 |
| - return target; |
25 | 20 | }
|
26 | 21 | },
|
27 | 22 |
|
|
106 | 101 |
|
107 | 102 | // If `x` is a promise, adopt its (future) state
|
108 | 103 | if (x instanceof TillthenPromise) {
|
109 |
| - if (x.getState() === "fulfilled") { return deferred.fulfill(x.getResult()); } |
110 |
| - if (x.getState() === "rejected") { return deferred.reject(x.getResult()); } |
| 104 | + if (x.state === "fulfilled") { return deferred.fulfill(x.result); } |
| 105 | + if (x.state === "rejected") { return deferred.reject(x.result); } |
111 | 106 | return x.then(deferred.fulfill, deferred.reject);
|
112 | 107 | }
|
113 | 108 |
|
|
162 | 157 | // The actual promise. The deferred will derive from this
|
163 | 158 | promise = new TillthenPromise(),
|
164 | 159 |
|
| 160 | + // The deferred to be returned |
| 161 | + deferred = null, |
| 162 | + |
165 | 163 | // Queue a handler and a dependant deferred for fulfillment. When (and if) the
|
166 | 164 | // promise is fulfilled, the handler will be evaluated on promise's value and the
|
167 | 165 | // result will be used to resolve the dependant deferred
|
|
235 | 233 | return promise;
|
236 | 234 | };
|
237 | 235 |
|
238 |
| - // Attach `then`, `getState` and `getResult` methods to the promise: |
239 |
| - _.extend(promise, { |
| 236 | + // Attach `then` method as well as `state` and `result` getters to the promise: |
| 237 | + Object.defineProperties(promise, { |
240 | 238 |
|
241 | 239 | // Access the promise's current or eventual fulfillment value or rejection reason.
|
242 | 240 | // As soon as (if ever) the promise is fulfilled, the `onFulfilled` handler will
|
243 | 241 | // be evaluated on the promise's fulfillment value. Similarly, as soon as (if ever)
|
244 | 242 | // the promise is rejected, the `onRejected` handler will be evaluated on the
|
245 | 243 | // rejection reason. Returns a new promise which will be eventually resolved
|
246 | 244 | // with the value / reason / promise returned by `onFulfilled` or `onRejected`
|
247 |
| - then: function (onFulfilled, onRejected) { |
248 |
| - |
249 |
| - // Create a new deferred, one which is *dependant* on (and will be resolved |
250 |
| - // with) the the value / reason / promise returned by `onFulfilled` or |
251 |
| - // `onRejected` |
252 |
| - var dependantDeferred = createDeferred(); |
253 |
| - |
254 |
| - // Queue `onFulfilled` and `onRejected` for evaluation upon the promise's |
255 |
| - // eventual fulfillment or rejection |
256 |
| - queueForFulfillment(onFulfilled, dependantDeferred); |
257 |
| - queueForRejection(onRejected, dependantDeferred); |
258 |
| - |
259 |
| - // Return the dependant deferred's underlying promise |
260 |
| - return dependantDeferred.promise; |
| 245 | + then: { |
| 246 | + value: function (onFulfilled, onRejected) { |
| 247 | + // Create a new deferred, one which is *dependant* on (and will be resolved |
| 248 | + // with) the the value / reason / promise returned by `onFulfilled` or |
| 249 | + // `onRejected` |
| 250 | + var dependantDeferred = createDeferred(); |
| 251 | + |
| 252 | + // Queue `onFulfilled` and `onRejected` for evaluation upon the promise's |
| 253 | + // eventual fulfillment or rejection |
| 254 | + queueForFulfillment(onFulfilled, dependantDeferred); |
| 255 | + queueForRejection(onRejected, dependantDeferred); |
| 256 | + |
| 257 | + // Return the dependant deferred's underlying promise |
| 258 | + return dependantDeferred.promise; |
| 259 | + } |
261 | 260 | },
|
262 | 261 |
|
263 | 262 | // Get the promise's current state ('pending', 'fulfilled' or 'rejected')
|
264 |
| - getState: function () { return state; }, |
| 263 | + state: { get: function () { return state; } }, |
265 | 264 |
|
266 |
| - // Get the promise's result (value or reason). Valid on after the promise has been |
267 |
| - // either fulfilled or rejected |
268 |
| - getResult: function () { return result; } |
| 265 | + // Get the promise's result (value or reason). Valid only after the promise has |
| 266 | + // either been fulfilled or rejected |
| 267 | + result: { get: function () { return result; } } |
269 | 268 | });
|
270 | 269 |
|
271 |
| - // Derive a deferred from the promise and return it |
| 270 | + // Derive a deferred from the promise, attach needed methods and return it |
272 | 271 | TillthenDeferred.prototype = promise;
|
273 |
| - return _.extend(new TillthenDeferred(), { |
274 |
| - promise: promise, |
275 |
| - fulfill: fulfill, |
276 |
| - reject: reject, |
277 |
| - resolve: function (valueOrPromise) { resolveDeferred(this, valueOrPromise); } |
| 272 | + deferred = new TillthenDeferred(); |
| 273 | + Object.defineProperties(deferred, { |
| 274 | + |
| 275 | + // Get the deferred's underlying promise |
| 276 | + promise: { get: function () { return promise; } }, |
| 277 | + |
| 278 | + // Fulfill the promise with given value |
| 279 | + fulfill: { value: fulfill }, |
| 280 | + |
| 281 | + // Reject the promise with given reason |
| 282 | + reject: { value: reject }, |
| 283 | + |
| 284 | + // Resolve the promise with given `result`: Fulfill it if `result` is a _value_, or |
| 285 | + // cause it to assume `result`'s (future) state if it's a _promise_ itself |
| 286 | + resolve: { value: function (result) { resolveDeferred(this, result); } } |
278 | 287 | });
|
| 288 | + return deferred; |
279 | 289 | };
|
280 | 290 |
|
281 | 291 | // Attach the `defer` / `getVersion` methods to Tillthen and return it
|
282 |
| - return _.extend(tillthen, { |
| 292 | + Object.defineProperties(tillthen, { |
283 | 293 |
|
284 | 294 | // Get a deferred object: A pending promise with `resolve`, `fulfill` and `reject` methods
|
285 |
| - defer: createDeferred, |
| 295 | + defer: { value: createDeferred }, |
286 | 296 |
|
287 | 297 | // Get current version of Tillthen
|
288 |
| - getVersion: function () { |
289 |
| - return "0.2.1"; // Keep in sync with package.json |
290 |
| - } |
| 298 | + version: { get: function () { return "0.2.1"; } } |
291 | 299 | });
|
| 300 | + return tillthen; |
292 | 301 | }));
|
0 commit comments