对promise对象的理解


一、promise是什么?

1. 理解

抽象表达

  • Promise 是一门新的技术(ES6 规范)
  • Promise对象是ES6( ECMAScript 2015 )对于异步操作提供的一种解决方案,比传统的解决方案更合理、更强大(备注:旧方案是单纯使用回调函数)

具体表达

  • 从语法上来说: Promise 是一个构造函数
  • 从功能上来说: promise 对象用来封装一个异步操作并可以获取其成功/失败的结果值

2. promise 的状态

promise是同步的,.then是异步的

Promise对象有三种状态:
(1)pendding:表示初始状态;
(2)fulfilled:resolve方法调用的时候,表示操作成功;
(3)rejected:reject方法调用的时候,表示操作失败;
Promise对象的状态不受外界影响
状态只能从pendding---->fulfilled或者pendding---->rejected,不能逆向转换

二、Promise 构造函数的基本用法

1.Promise示例

let p = new Promise(function (resolve, reject) {
    
    
    // 此处做一个异步的事情  要么成功要么失败
    resolve('成功的回调')
    // reject('失败的回调')
})

//then方法接收2个回调要么成功,要么失败
p.then((value)=>{
    
    
    console.log(value)
},(reason)=>{
    
    
    console.log(reason)
})
//catch专门处理失败回调,只有一个失败回调
p.catch((reason)=>{
    
    
    console.log(reason)
})

2.Promise.all 方法

参数:接受一个数组,数组内都是Promise实例
返回值:返回一个Promise实例,这个Promise实例的状态转移取决于参数的Promise实例的状态变化。当参数中所有的实例都处于resolve状态时,返回的Promise实例会变为resolve状态。如果参数中任意一个实例处于reject状态,返回的Promise实例变为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);
      }
   });
}

3.Promise.race 方法

参数:接受一个数组,数组内都是Promise实例
返回值:返回一个Promise实例,这个Promise实例的状态转移取决于参数的Promise实例的状态变化。当参数中任何一个实例处于resolve状态时,返回的Promise实例会变为resolve状态。如果参数中任意一个实例处于reject状态,返回的Promise实例变为reject状态。

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

三、为什么要用Promise?

每次请求都依赖上一次请求返回的数据来作为参数,然后继续发出请求,层层嵌套,会形成回调地狱。Promise可以解决回调地狱也可以解决请求异步问题。

  • 指定回调函数的方式更加灵活
    旧的: 必须在启动异步任务前指定
    promise: 启动异步任务 => 返回 promie 对象 => 给 promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)
  • 支持链式调用, 可以解决回调地狱问题
    什么是回调地狱? 回调函数嵌套调用, 外部回调函数异步执行的结果是嵌套的回调执行的条件,格式上不断地进行缩进。
  • 回调地狱的缺点:不便于阅读、不便于异常处理
  • 回调地狱解决方案:promise 链式调用
    终极解决方案:async/await

猜你喜欢

转载自blog.csdn.net/qq_50906507/article/details/128041614