Source: promise.js

  1. /*global process*/
  2. 'use strict';
  3. var _ = require('lodash/core');
  4. /**
  5. * @callback ResolvedCallback
  6. * @param {T} result - Resolved value
  7. * @returns {S}
  8. * @template T,S
  9. */
  10. /**
  11. * @callback RejectedCallback
  12. * @param {Error} reason - Rejected reason
  13. * @returns {S}
  14. * @template S
  15. */
  16. /**
  17. * @callback ResolveCallback
  18. * @param {T} result
  19. * @template T
  20. */
  21. /**
  22. * @callback RejectedCallback
  23. * @param {Error} reason - Rejected reason
  24. * @returns {S}
  25. * @template S
  26. */
  27. /**
  28. * @callback PromiseCallback
  29. * @param {ResolveCallback.<T>} resolve
  30. * @param {RejectCallback} reject
  31. * @template T
  32. */
  33. /**
  34. * Promise class with a little extension
  35. *
  36. * @class Promise
  37. * @constructor
  38. * @param {PromiseCallback.<T>}
  39. * @template T
  40. */
  41. var Promise = require('promise/lib/es6-extensions');
  42. /**
  43. * The "then" method from the Promises/A+ specification
  44. *
  45. * @method Promise#then
  46. * @param {FulfilledCallback.<T, S1>} [onFulfilled]
  47. * @param {RejectedCallback.<S2>} [onRejected]
  48. * @returns {Promise.<S1|S2>}
  49. */
  50. /**
  51. * Call "then" using given node-style callback function.
  52. * This is basically same as "nodeify" except that it always return the original promise
  53. *
  54. * @method Promise#thenCall
  55. * @param {Callback.<T>} [callback] - Callback function
  56. * @returns {Promise}
  57. */
  58. Promise.prototype.thenCall = function(callback) {
  59. if (_.isFunction(callback)) {
  60. this.then(function(res) {
  61. process.nextTick(function() {
  62. callback(null, res);
  63. });
  64. }, function(err) {
  65. process.nextTick(function() {
  66. callback(err);
  67. });
  68. });
  69. }
  70. return this;
  71. };
  72. /**
  73. * A sugar method, equivalent to promise.then(undefined, onRejected).
  74. *
  75. * @method Promise#catch
  76. * @param {RejectedCallback.<S>} onRejected
  77. * @returns {Promise.<S>}
  78. */
  79. /**
  80. * Synonym of Promise#catch
  81. *
  82. * @method Promise#fail
  83. * @param {RejectedCallback.<S>} onRejected
  84. * @returns {Promise.<S>}
  85. */
  86. Promise.prototype.fail = Promise.prototype['catch'];
  87. /**
  88. * Returns resolving promise with given reason
  89. *
  90. * @method Promise.resolve
  91. * @param {*} result - Resolved value
  92. * @returns {Promise}
  93. */
  94. /**
  95. * Returns rejecting promise with given reason
  96. *
  97. * @method Promise.reject
  98. * @param {Error} reason - Rejecting reason
  99. * @returns {Promise}
  100. */
  101. /**
  102. * Returns a promise that is fulfilled with an array containing the fulfillment value of each promise,
  103. * or is rejected with the same rejection reason as the first promise to be rejected.
  104. *
  105. * @method Promise.all
  106. * @param {Array.<Promise.<*>|*>} promises
  107. * @returns {Promise.<Array.<*>>}
  108. */
  109. /**
  110. * Returns a deferred object
  111. *
  112. * @method Promise.defer
  113. * @returns {Deferred}
  114. */
  115. Promise.defer = function() {
  116. return new Deferred();
  117. };
  118. /**
  119. * Deferred object
  120. *
  121. * @protected
  122. * @constructor
  123. */
  124. var Deferred = function() {
  125. var self = this;
  126. this.promise = new Promise(function(resolve, reject) {
  127. self.resolve = resolve;
  128. self.reject = reject;
  129. });
  130. };
  131. /**
  132. * Resolve promise
  133. * @method Deferred#resolve
  134. * @param {*} result - Resolving result
  135. */
  136. /**
  137. * Reject promise
  138. * @method Deferred#reject
  139. * @param {Error} error - Rejecting reason
  140. */
  141. /**
  142. *
  143. */
  144. module.exports = Promise;