• ES6高级-Promise的用法


    概念:相当于一个容器,保存着未来才会结束的事件(异步操作)的一个结果。

     特点:

    1.对象的状态不受外界影响,处理异步操作三个状态:Pending(进行) Resolved(成功) Rejected(失败)。

    2.一旦状态改变就不会再变。

    (1)Promise对象有两个方法:

    1.then()方法是执行异步任务返回成功的结果

    then()的第一个参数是resolve回调函数,第二个参数是可选的,是reject状态回调的函数,then()方法返回的是一个新的Promise实例可以采用链式编程。

    2.catch()方法是执行异步任务返回失败的结果

    catch(err=>console.log(err))方法相当于then(null,err=>console.log(err)),所以用then写的可以改成下面这样(下面的写法也是最常用的写法):

     

     来看几个Promise的案例代码

    (一)

    1.     <script>
    2.         // resolved和rejected都是函数
    3.         let pro = new Promise(function(resolved, rejected) {
    4.             let res = {
    5.                     code: 201,
    6.                     data: {
    7.                         name: 'sy'
    8.                     },
    9.                     error: '错误啦'
    10.                 }
    11.                 // 执行异步操作
    12.             setTimeout(() => {
    13.                 if (res.code === 200) {
    14.                     resolved(res.data);
    15.                 } else {
    16.                     rejected(res.error);
    17.                 }
    18.             }, 1000)
    19.         })
    20.         pro.then(val => console.log(val), error => console.log(error))
    21.     script>

    输出结果:

     (二)下面这个代码很重要:通过Promise来设置定时器的秒数

    1.     <script>
    2.         // resolved和rejected都是函数
    3.         function timeout(ms) {
    4.             return new Promise((resolved, rejected) => {
    5.                 setTimeout(() => {
    6.                     resolved('hello');
    7.                 }, ms)
    8.             })
    9.         }
    10.         timeout(2000).then(val => console.log(val))//hello
    11.     script>

    then()返回的是一个新的Promise实例,看下面的代码:

    1.     <script>
    2.         // resolved和rejected都是函数
    3.         // 采用Promise来规定定时器的秒数
    4.         function timeout(ms) {
    5.             return new Promise((resolved, rejected) => {
    6.                 setTimeout(() => {
    7.                     resolved('hello');
    8.                 }, ms)
    9.             })
    10.         }
    11.         let sy = timeout(2000).then(val => {
    12.             console.log(val);
    13.             return [1, 2, 3, 4];
    14.         }).then(val => console.log(val))
    15.         console.log(sy);
    16.     script>

    输出结果:

     (2)Promise对象的其他方法

    关于Promise是同步还是异步可以看这个博客:promise是同步还是异步的?_Shi Jian Xin的博客-CSDN博客_promise是同步还是异步

    1.resolve()方法

    返回的是一个Promise实例,看下面的代码:

    1.     <script>
    2.         let p = Promise.resolve('foo');
    3.         // 上面这句话和下面这句话等价
    4.         // let p = new Promise(resolve => resolve('foo'));
    5.         console.log(p);
    6.         p.then(val => console.log(val));//foo
    7.     script>

    输出结果:

     2.reject()方法

    返回的同样是一个Promise实例,看下面的代码:

    1.     <script>
    2.         let p = Promise.reject('foo');
    3.         // 上面这句话和下面这句话等价
    4.         // let p = new Promise(reject => reject('foo'));
    5.         console.log(p);
    6.         p.catch(val => console.log(val));
    7.     script>

     3.all()方法

    有时候会有多个Promise,比如在游戏控制的时候,Promise1是图片加载,Promise2是flash加载,Promise3是静态资源加载,要求当三个都加载完成之后再进行页面的初始化,这个时候就要用到all()方法,总结就是异步并行操作。

    (4)race()方法

    某个异步请求设置超时时间,并且在超时后执行相应的操作(重要)

    1.     <script>
    2.         function requestimg(imgsrc) {
    3.             return new Promise((resolve, reject) => {
    4.                 const img = new Image();
    5.                 img.src = imgsrc;
    6.                 img.onload = function() {
    7.                     // 请求成功返回一个Img对象
    8.                     resolve(img);
    9.                 }
    10.             })
    11.         }
    12.         function timeout() {
    13.             return new Promise((resolve, reject) => {
    14.                 setTimeout(() => {
    15.                     reject('图片请求超时');
    16.                 }, 3000)
    17.             })
    18.         }
    19.         // 三秒之内如果请求到了图片就返回图片对象,如果没有返回图片就返回的’图片请求超时‘
    20.         Promise.race([requestimg('img/1.jpg'), timeout()]).then(data => {
    21.             console.log(data);
    22.             document.body.appendChild(data)
    23.         }).catch(err => console.log(err))
    24.     script>

    输出结果:

    (5)done()和finally()

    不管是resolve还是reject,也就是不管成功还是失败,done()和finally()方法始终会执行。

  • 相关阅读:
    C++学习 --map
    ②、企业快速开发平台Spring Cloud之HTML 元素
    MySQL——子查询和嵌套查询
    净亏损2.9亿元,财务业绩陷入困境后,逸仙电商盈利仍遥遥无期
    C语言:数组的删除
    Unity3D学习笔记4——创建Mesh高级接口
    上周热点回顾(6.19-6.25)
    nodejs+vue水浒鉴赏平台系统
    深入探究Python多进程编程:Multiprocessing模块基础与实战【第98篇—Multiprocessing模块】
    vue3中使用el-upload + tui-image-editor进行图片处理
  • 原文地址:https://blog.csdn.net/qq_43781887/article/details/126153919