Promise简述

638 阅读2分钟

一.Promise的理解和使用

  1. Promise是什么 ==> 承诺,许诺(数据)

    抽象表达:Promise是js中进行异步编程新的解决方案(旧:纯回调从事)

    具体表达:从语法上来说:Promise是一个构造函数

    ​ 从功能上来说:Promise对象用来封装一个异步操作并可以得到其异步执行的结果

  2. Promise的状态改变

    • pending变为resolved

    • pending变为rejecter

      说明:只有这两种,且一个Promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason

二.Promise基本使用信息

//1.创建一个Promise对象
const pro = new Promise ((resolve,reject)=>{ //执行器函数
  //2.执行异步操作任务
  //3.1成功调用resolve(value)
  if(time%2==0){
    resolve('成功的数据','time'+time)
  }else{
 		//3.2失败调用reject(value)
    reject('失败的数据','time'+time)
	}
})
pro.then(
  value=>{ //接收成功的value数据 onResolved
		console.log("成功时的回调",value);
  },
  reson=>{ //接收失败的value数据 onReject
		console.log("失败时的回调",value);
  }
)

三.为什么使用Promise

  1. 指定回调函数更加灵活

    旧的:必须在启动异步任务前指定

    Promise:启动异步任务 => 返回Promise对象 => 给Promise对象绑定回调函数(甚至可以异步任务结束后指定)

    //成功的回调函数
    function successCallback(result){
      conslo.log("声音文件创建成功:" + result)
    }
    //失败的回调函数
    function failureCallback(error){
      conslo.log("失败文件创建成功:" + error)
    }
    
    /*使用纯回调函数*/ //先设置回调,再解决设置异步任务
    createAudioFileAsync("异步任务",successCallback,failureCallback)
    
    //使用Promise 执行器函数先执行,同步回调,先启动异步任务,在进行异步回调,可以后设置回调,结束后设置也可以
    const promise = createAudioFileAsync("异步任务");
    promise.then(successCallback,failureCallback); //成功回调,失败回调
    
  2. 支持链式调用,可以解决回调地域的问题

    //回调地域 
    //什么是回调地域:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件
    //回调地域的缺点:不便于阅读,不便于处理异常
    //解决方案:promise链式调用   async/await
    doSomething(function(result){ //多个异步回调操作,并且串联执行
      doSomethingElse(result,function(newResult){
        doThidThing(newPesult,function(finalResult){
          console.log(finalResult)
        },failureCallback) //失败的回调,难以解决
      },failureCallback)
    },failureCallback)
    
    //使用Promise的链式调用解决回调地域
    doSomething.then(function(result){ //自上而下写法便于阅读
      return doSomethingElse(result);
    })
    .then(function(newResult){
      return doThidThing(newResult);
    })
    .then(function(finalResult){
      console.log(finalResult);
    })
    .catch(failureCallback) //失败回调集中式处理
    
    //使用 async/await:解决回调地域
    async function request(){ //从源码看是没有回调函数
      try {
        const result = await doSomething(); //接收成功后的结果
        const newResult = await doSomethingElse(result); //传递给下个方法
        const finalResult = await doThidThing(newResult);
      } catch(error) {
        failureCallback(error); //失败的处理
      }
    }