es6-extensions.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. 'use strict';
  2. //This file contains the ES6 extensions to the core Promises/A+ API
  3. var Promise = require('./core.js')
  4. var asap = require('asap')
  5. module.exports = Promise
  6. /* Static Functions */
  7. function ValuePromise(value) {
  8. this.then = function (onFulfilled) {
  9. if (typeof onFulfilled !== 'function') return this
  10. return new Promise(function (resolve, reject) {
  11. asap(function () {
  12. try {
  13. resolve(onFulfilled(value))
  14. } catch (ex) {
  15. reject(ex);
  16. }
  17. })
  18. })
  19. }
  20. }
  21. ValuePromise.prototype = Promise.prototype
  22. var TRUE = new ValuePromise(true)
  23. var FALSE = new ValuePromise(false)
  24. var NULL = new ValuePromise(null)
  25. var UNDEFINED = new ValuePromise(undefined)
  26. var ZERO = new ValuePromise(0)
  27. var EMPTYSTRING = new ValuePromise('')
  28. Promise.resolve = function (value) {
  29. if (value instanceof Promise) return value
  30. if (value === null) return NULL
  31. if (value === undefined) return UNDEFINED
  32. if (value === true) return TRUE
  33. if (value === false) return FALSE
  34. if (value === 0) return ZERO
  35. if (value === '') return EMPTYSTRING
  36. if (typeof value === 'object' || typeof value === 'function') {
  37. try {
  38. var then = value.then
  39. if (typeof then === 'function') {
  40. return new Promise(then.bind(value))
  41. }
  42. } catch (ex) {
  43. return new Promise(function (resolve, reject) {
  44. reject(ex)
  45. })
  46. }
  47. }
  48. return new ValuePromise(value)
  49. }
  50. Promise.all = function (arr) {
  51. var args = Array.prototype.slice.call(arr)
  52. return new Promise(function (resolve, reject) {
  53. if (args.length === 0) return resolve([])
  54. var remaining = args.length
  55. function res(i, val) {
  56. try {
  57. if (val && (typeof val === 'object' || typeof val === 'function')) {
  58. var then = val.then
  59. if (typeof then === 'function') {
  60. then.call(val, function (val) { res(i, val) }, reject)
  61. return
  62. }
  63. }
  64. args[i] = val
  65. if (--remaining === 0) {
  66. resolve(args);
  67. }
  68. } catch (ex) {
  69. reject(ex)
  70. }
  71. }
  72. for (var i = 0; i < args.length; i++) {
  73. res(i, args[i])
  74. }
  75. })
  76. }
  77. Promise.reject = function (value) {
  78. return new Promise(function (resolve, reject) {
  79. reject(value);
  80. });
  81. }
  82. Promise.race = function (values) {
  83. return new Promise(function (resolve, reject) {
  84. values.forEach(function(value){
  85. Promise.resolve(value).then(resolve, reject);
  86. })
  87. });
  88. }
  89. /* Prototype Methods */
  90. Promise.prototype['catch'] = function (onRejected) {
  91. return this.then(null, onRejected);
  92. }