UNPKG

1.23 kBJavaScriptView Raw
1/*
2 * Copyright 2013 the original author or authors
3 * @license MIT, see LICENSE.txt for details
4 *
5 * @author Scott Andrews
6 */
7
8(function (define) {
9 'use strict';
10
11 define(function (require) {
12
13 var when, whenFn;
14
15 when = require('when');
16 whenFn = require('when/function');
17
18 /**
19 * Create a promise whose work is started only when a handler is registered.
20 *
21 * The work function will be invoked at most once. Thrown values will result
22 * in promise rejection.
23 *
24 * @param {Function} work function whose ouput is used to resolve the
25 * returned promise.
26 * @returns {Promise} a lazy promise
27 */
28 function lazyPromise(work) {
29 var defer, started, resolver, promise, then;
30
31 defer = when.defer();
32 started = false;
33
34 resolver = defer.resolver;
35 promise = defer.promise;
36 then = promise.then;
37
38 promise.then = function () {
39 if (!started) {
40 started = true;
41 whenFn.apply(work).then(resolver.resolve, resolver.reject);
42 }
43 return then.apply(promise, arguments);
44 };
45
46 return promise;
47 }
48
49 return lazyPromise;
50
51 });
52
53}(
54 typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }
55 // Boilerplate for AMD and Node
56));