Promise了解笔记

1.什么是Promise?
      Promise是异步编程的一种解决方案,它是一个异步操作的容器.
      当有异步操作时,使用Promise对这个异步操作进行封装.
      new Promise(function(resolve,reject){
        new ->构造函数(1.保存一些状态信息 2.执行传入的函数)
        resolve与reject是回调函数中的两个参数,但是resolve和reject本身又是一个函数.当异步操作成功时,调用resolve函数参数;当异步操作失败时,调用reject函数参数
      })

new Promise(function(resolve,reject){
            setTimeout(function(){
              .....执行异步操作内容
              如果操作成功 resolve(操作成功后需要返回的信息)
              如果操作失败 reject(操作失败后需要返回的信息)
            })
          }).then(function(res){
            ....res表示操作成功后调用resolve函数传递过来的信息
          }).catch(function(err){
            ...err表示操作失败后调用reject函数参数传递过来的信息
          })

1.5.如何创建Promise对象并添加异步任务
      Promise对象通过使用构造函数Promise来创建,并且需要接收一个执行函数(executor)(即回调函数), 这个函数内包含了初始化Promise的一些代码.该执行函数接收 resolve 和 reject 两个参数(其实是两个函数)。
          resolve 函数会在执行函数成功运行后发出信号表示该 promise 已经可用。
          reject 函数代表该执行函数运行失败。

 new Promise(function(resolve,reject){
        ...初始化Promise的代码.
        if(异步任务成功){
          resolve(异步任务成功的信息);
        }else{
          reject(异步任务失败的信息)
        }
      })

2.Promise的三种状态(生命周期)
      pending:等待状态,即正在进行网络请求,或者定时器还没有达到触发时间的这段时间
      fulfill:满足状态(成功),当我们主动回调了resolve()时,就处于该状态,并且会回调.then()。
      reject:拒绝状态(失败),当我们主动回调了reject()时,就处于该状态,并且会回调.catch()。

2.5.Promise的resolve()方法调用知识改变了状态,当调用过resolve()方法后,其他的resolve()方法就不再运行.
    即:多个resolve()方法调用,只会运行第一个resolve()方法.
    例如:

new Promise((resolve,reject)=>{
          //这里只会调用resolve(1),resolve(2)不会进行调用.
          resolve(1);
          resolve(2);
        })

3.Promise链式调用
      每次调用then方法会返回一个全新的Promise对象

new Promise((resolve,reject)=>{
            setTimeout(()=>{
              //进行异步操作
              let flag=true,
              let data='异步信息'
              let err='错误信息'
              if(flag){
                resolve(data)
              }else{
                reject(err)
              }
            },1000)
          }).then((res)=>{
            console.log(res)
            return new Promise((resolve,reject)=>{
              ......
            })
          })

4.关于.then()方法返回的Promise
      then方法总是返回一个新的Promise,而它的行为与then中的回调函数的返回值有关:
          如果then中的回调函数返回一个值,那么then返回的Promise将会成为接受状态,并且将返回的值作为接受状态的回调函数的参数值。
          如果then中的回调函数抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为拒绝状态的回调函数的参数值。
          如果 then 中的回调函数返回的是一个 promise A, 那么then返回的promise B的状态始终会与 promise A 保持一致. 并且回调函数的参数值也始终相同.promise A的回调函数的参数也始终与 promise B的回调函数的参数保持一致.

5.Promise的语法糖:async、await
      async用于声明一个function 是异步的,而await用于获取async声明的方法中的数据(因此await只能在async声明的function中使用)
      async 就是异步的意思,使用关键字 async声明异步函数.异步函数默认返回一个成功状态的promise.也可以在异步函数中添加return "abc"语句, 则会把这个值封装成 Promise.resolve("abc");
      如果想返回一个reject的Promise则可以在函数内部抛出一个异常即可.
      异步函数有如下变体:
          异步函数声明:async function foo(){}
          异步函数表达式:const foo = async function(){}
          异步方法定义:let obj = { async foo(){} }
          异步箭头函数:const foo = async () => {}
      简单使用async,异步函数总是返回Promises对象

async function testAsync(){
            return '哈哈'
          }
          console.log(testAsync()) ;//Promise {<resolved>: "哈哈"}
          testAsync().then((res)=>{ //获取该Promise对象中的数据
              console.log(res)
            })

异步函数执行的结果总是一个promise,这个promise在异步函数开始执行的时候被创建。
        然后函数体被执行,执行可能会通过return或throw永久完成,或者通过await临时完成(这种情况,之后会继续执行)。
        promise被返回。
        当执行异步函数体的时候,return x将会resolve(x),throw err将会reject(err),promise的完成是异步的。换句话说,then(),catch()中的回调函数总是在当前代码完成之后执行。
      
      await是等待的意思,在等待一个异步任务的完成. 它可以将一个异步函数变为同步函数.一般是等待一个 Promise resolve. 当然可以等任何其他的值.
      await 会等待, 等到Promise resolve之后, 他的运算的最终结果是resolve(值)中的值
      调用async函数虽然有等待, 但是并不会导致阻塞, 因为他内部的所有阻塞都封装在Promise对象中异步执行.
      注意: 操作符await(只能在async函数中使用)等待其操作数(promise)被完成
            若Promise被resolve,则其await的值就是resolve的值
            若Promise被reject,则await抛出reject的值

      例如:

async function getAy(){
            let value=await getNum(5);
          }

6.获取async声明的function中数据的方法

方法一:
      //通过调用方法
      async function getData(){
        let name='白骨精';
        return name;
      }

      const p=getData();
      p.then(res=>{
        console.log(res)
      })
    方法二:
      // 声明一个异步函数
      async function getData(){
        let name='白骨精';
        return name;
      }

      // 在一个异步函数中调用另一个异步函数
      async function getName(){
        let name=await getData()
        console.log(name)
      }
      //调用方法
      getName()

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值