对Promise的理解

1、Promise的理解

Promise是ES6的新语法,是JS中进行异步编程的新的解决方案,解决了回调地狱的问题
Promise对象是一个构造函数,可以创建实例对象,用来封装一个异步操作并可以获取其成功/失败的结果值

2、Promise的用法

利用关键字new创建Promise实例对象,参数是一个回调函数
回调函数有两个参数,一个是resolve,一个是reject
resolve:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去;

const p = new Promise((resolve, reject) => {
       if (...) {   // succeed
             resolve(result);        
       } else {     // fails
             reject(error);
       }
});

p.then(result=> {
  console.log(result)
})
p.catch(err => {
  console.log(error)
})

3、Promise的状态

Promise对象有三种状态
      初始状态:pending
      成功状态:fulfilled(又称resolved)
      失败状态:rejected
状态的转化
      初始状态pending—>成功状态fulfilled    执行resolve函数之后
      初始状态pending—>失败状态rejected    执行reject函数之后

状态转化不可以逆向,也不可以进行成功状态和失败状态转化

4、promise实例的方法

1、then方法
在成功状态fulfilled下调用then方法,then方法中的参数是resolve的参数,支持链式调用,之后的then方法中的参数是上个then方法的返回值,then可以接受两个回调函数作为参数,第二个参数可选。第一个回调函数是Promise对象的状态变为fulfilled时调用,第二个回调函数是Promise对象的状态变为Rejected时调用:

p.then(result=> {
  console.log(result)
}).then()

2、catch方法
在失败状态rejected下调用catch方法,catch方法中的参数是reject的参数,支持链式调用

p.catch(err => {
  console.log(error)
})

3、finally方法
不管是 resolve 还是 reject 都会调用 finally 。那么相当于 fianlly 方法替使用者分别调用了一次 then 的 resolved 和 rejected 状态回调。

5、Promise的方法

1、Promise.all方法
参数:接受一个数组,数组内都是Promise实例
返回一个Promise对象
所有参数数组 Promise 实例执行 resolve 回调后,新实例执行 resolve 回调;
如果中间有任何一个 Promise 实例执行 reject 回调,那么新实例就直接执行 reject 回调了。

Promise.all = function(promises){
     return new Promise(function(resolve,reject){
       let done = gen(promises.length,resolve);
       for(let i=0;i<promises.length;i++){
         promises[i].then(function(data){
           done(i,data);
         },reject);
      }
   });
}

2、Promise.race方法
参数:接受一个数组,数组内都是Promise实例
返回一个Promise对象
返回最快完成那一个 Promise 实例。
只要参数数组中有一个 Promise 实例执行 resolve 回调或 reject 回调后,新实例就直接返回结果。

Promise.race = function(promises){
      return new Promise(function(resolve,reject){
        for(let i=0;i<promises.length;i++){
          promises[i].then(resolve,reject);
        }
    });
}

3、Promise.any方法
参数:接受一个数组,数组内都是Promise实例
返回一个Promise对象
所有参数数组 Promise 实例执行 reject回调后,新实例执行 reject回调;
如果中间有任何一个 Promise 实例执行 resolve 回调,那么新实例就直接执行 resolve 回调了。

Promise.all()全部子实例都成功才算成功,有一个子实例失败就算失败。
Promise.any有一个子实例成功就算成功,全部子实例失败才算失败。
Promise.race()是赛跑机制,要看最先的promise子实例是成功还是失败。

6、promise的作用

Promise可以解决回调地狱也可以解决请求异步问题。

支持链式调用, 可以解决回调地狱问题
每次请求都依赖上一次请求返回的数据来作为参数,然后继续发出请求,层层嵌套,会形成回调地狱。
回调地狱的缺点:不便于阅读、不便于异常处理
回调地狱解决方案:promise 链式调用
终极解决方案:async/await

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值