首先写一个原始的 Promise

  1. let OP = new promise((res,rej) =>{
  2. res(0)
  3. })
  4. op.then((val) =>{
  5. console.log(val)
  6. },(rej) =>{
  7. console.log(reason)
  8. })

ES5 模拟

  1. function MyPromise(executor){
  2. this.status = 'pending';
  3. var _self = this;
  4. _self.resolveValue = null;
  5. _self.rejectValue = null;
  6. function resolve(val){
  7. if(_self.status == 'pending'){
  8. _self.status = 'Fulfilled';
  9. _self.resolveValue = val
  10. }
  11. }
  12. function reject(reason){
  13. if(_self.status == 'pending'){
  14. _self.status = 'Rejected';
  15. _self.rejectValue = reason;
  16. }
  17. }
  18. try{
  19. executor(resolve, reject);
  20. }catch(e){
  21. reject(e);
  22. }
  23. executor(resolve, reject);
  24. }
  25. MyPromise.prototype.then = function(onFulfilled,onRejected){
  26. var self = this;
  27. if(self.status == 'Fulfilled'){
  28. onFulfilled(_self.resolveValue);
  29. }
  30. if(self.status == 'Rejected'){
  31. onRejected(_self.rejectValue);
  32. }
  33. }

异步操作

  1. function MyPromise(executor){
  2. this.status = 'pending';
  3. var _self = this;
  4. _self.resolveValue = null;
  5. _self.rejectValue = null;
  6. _self.ResolveCallBackList = [];
  7. _self.RejectCallBackList = [];
  8. function resolve(val){
  9. if(_self.status == 'pending'){
  10. _self.status = 'Fulfilled';
  11. _self.resolveValue = val
  12. _self.ResolveCallBackList.forEach(function(ele){
  13. ele();
  14. })
  15. }
  16. }
  17. function reject(reason){
  18. if(_self.status == 'pending'){
  19. _self.status = 'Rejected';
  20. _self.rejectValue = reason;
  21. _self.RejectCallBackList.forEach(function(ele){
  22. ele();
  23. })
  24. }
  25. }
  26. try{
  27. executor(resolve, reject);
  28. }catch(e){
  29. reject(e);
  30. }
  31. executor(resolve, reject);
  32. }
  33. MyPromise.prototype.then = function(onFulfilled,onRejected){
  34. var self = this;
  35. if(self.status == 'Fulfilled'){
  36. onFulfilled(_self.resolveValue);
  37. }
  38. if(self.status == 'Rejected'){
  39. onRejected(_self.rejectValue);
  40. }
  41. //
  42. if(self.status == 'pending'){
  43. self.ResolveCallBackList.push(function(){
  44. onFulfilled(_self.resolveValue);
  45. })
  46. self.RejectCallBackList.push(function(){
  47. onRejected(_self.rejectValue);
  48. })
  49. }
  50. }

链式调用

  1. function MyPromise(executor){
  2. this.status = 'pending';
  3. var _self = this;
  4. _self.resolveValue = null;
  5. _self.rejectValue = null;
  6. _self.ResolveCallBackList = [];
  7. _self.RejectCallBackList = [];
  8. function resolve(val){
  9. if(_self.status == 'pending'){
  10. _self.status = 'Fulfilled';
  11. _self.resolveValue = val
  12. _self.ResolveCallBackList.forEach(function(ele){
  13. ele();
  14. })
  15. }
  16. }
  17. function reject(reason){
  18. if(_self.status == 'pending'){
  19. _self.status = 'Rejected';
  20. _self.rejectValue = reason;
  21. _self.RejectCallBackList.forEach(function(ele){
  22. ele();
  23. })
  24. }
  25. }
  26. try{
  27. executor(resolve, reject);
  28. }catch(e){
  29. reject(e);
  30. }
  31. executor(resolve, reject);
  32. }
  33. MyPromise.prototype.then = function(onFulfilled,onRejected){
  34. var self = this;
  35. var nextPromise = new MyPromise(function(res, rej){
  36. if(self.status == 'Fulfilled'){
  37. var nextResolveValue = onFulfilled(_self.resolveValue);
  38. res(nextResolveValue)
  39. }
  40. if(self.status == 'Rejected'){
  41. var nextRejectValue = onRejected(_self.rejectValue);
  42. res(nextRejectValue);
  43. }
  44. //
  45. if(self.status == 'pending'){
  46. self.ResolveCallBackList.push(function(){
  47. var nextResolveValue = onFulfilled(_self.resolveValue);
  48. res(nextResolveValue)
  49. })
  50. self.RejectCallBackList.push(function(){
  51. var nextRejectValue = onRejected(_self.rejectValue);
  52. res(nextRejectValue);
  53. })
  54. }
  55. })
  56. return nextPromise;
  57. }