• Promise小结


    promise ES6新增的一个重要属性

    promise是解决异步编程的一种解决方案 主要简化网络请求 避免回调地狱

    同步指的是一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。

    异步指的是每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

    首先js是单线程的语言,即同一时间只能做做一件事。那Js如何实现异步的,异步和单线程不是自相矛盾吗?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性

      什么情况下会用到Promise?

      new > 构造函数(1.保存了一些状态信息 2.执行传入的函数)

    创建新空间 存入对象  this指向这个对象  执行构造函数代码 给对象数据  最后 return 出来

    在执行传入的回调函数时

    会传入两个参数 resolve reject 本身又是函数  then 执行下一步 catch捕获错误

    一般情况下 有异步操作时。会使用Promise 对这个异步操作进行封装

    它是链式结构 比嵌套明了

    1. //1.使用setTimeout 实现异步操作
    2. setTimeout(()=>{
    3. console.log('hello world');
    4. },1000)
    5. new Promise((resolve,reject) => {
    6. //第一次网络请求的代码
    7. setTimeout(()=>{
    8. resolve()
    9. },1000)
    10. }).then(()=>{
    11. //返回数据处理第一次的代码
    12. console.log('第一次延迟打印1');
    13. return new Promise((resolve, reject)=>{
    14. //第二次网络请求的代码
    15. setTimeout(()=>{
    16. resolve()
    17. },1000)
    18. }).then(()=>{
    19. //返回数据处理第二次的代码
    20. console.log('第二次延迟打印2');
    21. console.log('第二次延迟打印2');
    22. return new Promise((resolve, reject) => {
    23. //第三次网络请求的代码
    24. setTimeout(()=>{
    25. resolve()
    26. },1000)
    27. }).then(()=>{
    28. //返回数据处理第三次的代码
    29. console.log('第三次延迟打印3');
    30. console.log('第三次延迟打印3');
    31. console.log('第三次延迟打印3');
    32. })
    33. })
    34. })
    35. //什么情况下会用到Promise?
    36. //一般情况下 有异步操作时。会使用Promise 对这个异步操作进行封装
    37. // new > 构造函数(1.保存了一些状态信息 2.执行传入的函数)
    38. //在执行传入的回调函数时,会传入两个参数 resolve reject 本身又是函数
    39. new Promise((resolve, reject)=>{
    40. setTimeout(()=>{
    41. // 手动调用 只执行一次
    42. //成功的时候
    43. resolve('最后的数据')
    44. //失败的时候
    45. reject('错误信息')
    46. },4000)
    47. }).then((data)=>{
    48. console.log(data);
    49. }).catch((err)=>{
    50. console.log(err);
    51. })

    Promise 三种状态

    pending 等待状态 比如正在进行网络请求,或者定时器没有到时间

    fulfill: 满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调 then()

    reject: 拒绝状态,当我们主动回调了 reject 时, 就处于该状态,并且会回调catch()

      new Promise((resolve, reject)=>{
        setTimeout(()=>{
           // 手动调用 只执行一次
          //成功的时候
           resolve('最后的数据')
           //失败的时候
          reject('错误信息')

        },4000)
      }).then( data =>{
        console.log(data);
      }, err => {

         console.log(err);

    })

    Promise 链式调用 

    可以把网络请求的代码和 数据请求过来进行相关操作的代码 分离开来 灵活抛出 resolve reject 

    对应执行  then catch

    1. new Promise((resolve, reject)=>{
    2. setTimeout(()=>{
    3. resolve('aaa')
    4. },1000)
    5. }).then(skt=>{
    6. console.log(skt,'第一次处理的代码');
    7. return new Promise((resolve,reject) => {
    8. //resolve(skt+'bbb')
    9. reject()
    10. }).then(skt=>{
    11. console.log(skt,'第二次处理的代码');
    12. return new Promise(resolve => {
    13. resolve(skt+'ccc')
    14. })
    15. }).then(skt=>{
    16. console.log(skt,'第三次处理的代码');
    17. })
    18. }).catch(()=>{
    19. console.log('错误终止');
    20. }).catch(()=>{
    21. console.log('错误终止');
    22. })
    23. //简化 top1 new Promise((resolve => resolve(结果)) 简写
    24. new Promise((resolve, reject)=>{
    25. setTimeout(()=>{
    26. resolve('111')
    27. },2000)
    28. }).then(skt=>{
    29. console.log(skt,'第四次处理的代码');
    30. return Promise.resolve(skt+'222')
    31. }).then(skt=>{
    32. console.log(skt,'第五次处理的代码');
    33. return Promise.reject()
    34. }).then(skt=>{
    35. console.log(skt,'第六次处理的代码');
    36. }).catch(()=>{
    37. console.log('错误终止');
    38. })
    39. //再简化 省略Promise.resolve
    40. new Promise((resolve, reject)=>{
    41. setTimeout(()=>{
    42. resolve('123')
    43. },3000)
    44. }).then(skt=>{
    45. console.log(skt,'第七次处理的代码');
    46. return (skt+'456')
    47. }).then(skt=>{
    48. console.log(skt,'第八次处理的代码');
    49. //return (skt+'789')
    50. throw '错误终止'
    51. }).then(skt=>{
    52. console.log(skt,'第九次处理的代码');
    53. }).catch(()=>{
    54. console.log('错误终止');
    55. })

    Promise.all() 使用

    传入可迭代对象(类数组)为不同的Promise 它会在所有Promise结果为resolve时 执行最终的then,如果有一项为reject 那么就执行 catch

    1. Promise.all([
    2. new Promise((resolve, reject)=>{
    3. setTimeout(()=>{
    4. resolve([
    5. 1,2,3,4,5,{name:webkitURL}
    6. ])
    7. },2000)
    8. }),
    9. new Promise((resolve, reject)=>{
    10. setTimeout(()=>{
    11. //reject()
    12. resolve([14,24])
    13. },2000)
    14. }),
    15. ]).then(arr=>{
    16. console.log(arr[0]);
    17. console.log(arr[1]);
    18. }).catch(err => {
    19. console.log('项目中有失败的');
    20. })

  • 相关阅读:
    Google Earth Engine(GEE)——用reducers来获取某一个区域得响应值并转化为列
    苏宁suningAPI接入说明获得suning商品详情
    html静态网站基于HTML+CSS+JavaScript上海美食介绍网站网页设计与实现共计5个页面
    B+树索引页大小是如何确定的?
    emqx5.0.6 开启redis认证,配置acl规则,离线监听(保姆级图文实战教程)
    Redis——Jedis中hash类型使用
    并查集学习笔记
    树莓派断网自动连接
    MyBatis Generator 代码生成工具
    Leetcode 90. 子集 II
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/126241097