1. const PENDING = 'pending';
  2. const FULFILLED = 'fulfilled';
  3. const REJECTED = 'rejected';
  4. class MyPromise {
  5. constructor (executor) {
  6. this._status = PENDING;
  7. this._value = undefined;
  8. this._resolveQueue = [];
  9. this._rejectQueue = [];
  10. let _resolve = (val) => {
  11. const run = () => {
  12. if (this._status !== PENDING) return;
  13. this._status = FULFILLED;
  14. this._value = val;
  15. while (this._resolveQueue.length) {
  16. const callback = this._resolveQueue.shift();
  17. callback(val);
  18. }
  19. };
  20. setTimeout(run);
  21. };
  22. let _reject = (val) => {
  23. const run = () => {
  24. if (this._status !== PENDING) return;
  25. this._status = REJECTED;
  26. this._value = val;
  27. while (this._rejectQueue.length) {
  28. const callback = this._rejectQueue.shift();
  29. callback(val);
  30. }
  31. };
  32. setTimeout(run);
  33. };
  34. executor(_resolve, _reject);
  35. }
  36. then (resolveFn, rejectFn) {
  37. typeof resolveFn !== 'function' ? resolveFn = value => value : null;
  38. typeof rejectFn !== 'function' ? rejectFn = reason => {
  39. throw new Error(reason instanceof Error ? reason.message : reason);
  40. } : null;
  41. return new MyPromise((resolve, reject) => {
  42. let fulfilledFn = (val) => {
  43. try {
  44. let x = resolveFn(val);
  45. x instanceof MyPromise ? x.then(resolve, reject) : resolve(x);
  46. } catch (e) {
  47. reject(e);
  48. }
  49. };
  50. let rejectedFn = (error) => {
  51. try {
  52. let x = rejectFn(error);
  53. x instanceof MyPromise ? x.then(resolve, reject) : resolve(x);
  54. } catch (error) {
  55. reject(error);
  56. }
  57. };
  58. switch (this._status) {
  59. case FULFILLED:
  60. fulfilledFn(this._value);
  61. break;
  62. case REJECTED:
  63. rejectedFn(this._value);
  64. break;
  65. case PENDING:
  66. this._resolveQueue.push(fulfilledFn);
  67. this._rejectQueue.push(rejectedFn);
  68. break;
  69. }
  70. });
  71. };
  72. catch (rejectFn) {
  73. return this.then(undefined, rejectFn);
  74. }
  75. finally (callback) {
  76. return this.then(
  77. value => MyPromise.resolve(callback()).then(() => value),
  78. reason => MyPromise.resolve(callback()).then(() => {
  79. throw reason;
  80. }));
  81. }
  82. static resolve (value) {
  83. if (value instanceof MyPromise) return value;
  84. return new MyPromise((resolve) => resolve(value))
  85. }
  86. static reject (reason) {
  87. return new MyPromise((resolve, reject) => reject(reason))
  88. }
  89. static all (promiseArr) {
  90. let index = 0;
  91. let result = [];
  92. return new MyPromise((resolve, reject) => {
  93. promiseArr.forEach((p, i) => {
  94. MyPromise.resolve(p).then(
  95. val => {
  96. result[i] = val;
  97. index++;
  98. if (index === promiseArr.length) {
  99. resolve(result);
  100. }
  101. },
  102. err => {
  103. reject(err);
  104. });
  105. });
  106. });
  107. }
  108. static race (promiseArr) {
  109. return new MyPromise((resolve, reject) => {
  110. for (let p of promiseArr) {
  111. MyPromise.resolve(p).then(
  112. val => {
  113. resolve(val);
  114. },
  115. err => {
  116. reject(err);
  117. });
  118. }
  119. });
  120. }
  121. }
  122. //
  123. // new MyPromise((resolve, reject) => {
  124. // resolve('kkk')
  125. // })
  126. // .then(result => {
  127. // console.log(result);
  128. // return MyPromise.reject('reject')
  129. // })
  130. // .catch(error => {
  131. // console.log(error);
  132. // return 'jjj'
  133. // })
  134. // .finally((res) => {
  135. // console.log(666);
  136. // console.log(res);
  137. // return 'rr'
  138. // }).then(res => {
  139. // console.log(999);
  140. // console.log(res);
  141. // });
  142. let sss = MyPromise.race([new MyPromise(resolve => {
  143. setTimeout(() => {
  144. resolve(6666)
  145. }, 1000)
  146. }), 11, MyPromise.resolve(66), new MyPromise(resolve => {
  147. setTimeout(() => {
  148. resolve(999)
  149. })
  150. })]).then(res => {
  151. console.log(res);
  152. });

参考文档:

https://juejin.im/post/6844904096525189128 (9k字 | Promise/async/Generator实现原理解析)
https://juejin.im/post/6844903922964889608#heading-4 (手写Promise)
https://www.icode9.com/content-4-365156.html (Promise A+ 规范【中文版】)
https://juejin.cn/post/6844903607968481287#heading-0 (Promise不会??看这里!!!史上最通俗易懂的Promise!!!)