一、Promise、Promise.all、Promise.race

Promise用于发送异步请求时,针对不同返回结果(成功/失败)的处理。

  • Promise 用法

    1. function fn(){
    2. return new Promise((resolve, reject)=>{
    3. 成功时调用 resolve(数据)
    4. 失败时调用 reject(错误)
    5. })
    6. }
    7. fn().then(success, fail).then(success2, fail2)
  • Promise.all 用法

    1. Promise.all([promise1, promise2]).then(success1, fail1)

    promise1和promise2都成功才会调用success1

  • Promise.race 用法

    1. Promise.race([promise1, promise2]).then(success1, fail1)

    promise1和promise2只要有一个成功就会调用success1;
    promise1和promise2只要有一个失败就会调用fail1;
    总之,谁第一个成功或失败,就认为是race的成功或失败。

二、手写一个Promise

Promise 有三种状态:Pending 初始; Fulfilled 成功; Rejected 失败。

  1. function Promise(executor) {
  2. let self = this;
  3. self.status = 'pending'; //等待态
  4. self.value = undefined; //成功的返回值
  5. self.reason = undefined; //失败的原因
  6. function resolve(value){
  7. if(self.status === 'pending'){
  8. self.status = 'resolved';
  9. self.value = value;
  10. }
  11. }
  12. function reject(reason) {
  13. if(self.status === 'pending') {
  14. self.status = 'rejected';
  15. self.reason = reason;
  16. }
  17. }
  18. try{
  19. executor(resolve, reject);
  20. }catch(e){
  21. reject(e);// 捕获时发生异常,就直接失败
  22. }
  23. }
  24. //onFufiled 成功的回调
  25. //onRejected 失败的回调
  26. Promise.prototype.then = function (onFufiled, onRejected) {
  27. let self = this;
  28. if(self.status === 'resolved'){
  29. onFufiled(self.value);
  30. }
  31. if(self.status === 'rejected'){
  32. onRejected(self.reason);
  33. }
  34. }
  35. module.exports = Promise;