美文网首页
js - Promise

js - Promise

作者: 梁庄十年 | 来源:发表于2021-11-07 23:31 被阅读0次

    1 promise的定义

    • promise 是javascript中用来处理异步编程的方案, 可以理解为一个函数或者对象;
    image.png

    从输出结果中可以看出 Promise是一个构造函数, 有all, race, reject, resolve等方法, 原型链prototype中有catch,then等方法; 所以每次new Promise() 实例时都可以调用then,catch等方法;

    2 promise的优缺点

    • 优点:

    1 可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数;
    2 promise 对象提供统一的接口,使得控制异步操作更加容易;

    • 缺点:

    1 无法取消 Promise,一旦新建它就会立即执行,无法中途取消;
    2 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部;
    3 当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

    3 promise的状态

    • pending: 初始状态, 不是成功或者失败状态
    • fulfilled: 操作成功完成;
    • rejected: 操作失败;

    4 promise 的常用方法

    • resovle & reject
    <template>
      <div class="promise-con">
        <button @click="triggerPromise">promise</button>
      </div>
    </template>
    <script>
    export default {
      name: 'Promise',
      methods: {
        getNumber() {
          let pro = new Promise((resolve, reject) => {
            // 异步操作
            setTimeout(() => {
              let num = Math.ceil(Math.random() * 10); // 生成1-10的随机数;
              if(num < 5) {
                resolve(num)
              } else {
                reject ('数字太大了')
              }
            }, 500)
          })
          return pro;
        },
        triggerReject() {
          this.getNumber().then(res => {
            console.log('resolve: ', res);
          }).catch(error => {
            console.log('error: ', error);
          })
        },
      }
    }
    </script>
    
    输出小于5的数字或者string '数字太大了';
    

    Promise实例中可以传入两个回调函数用于处理成功和失败的情况;resolve: 成功, reject:失败; getNumber方法返回的是一个promise实例,每个promise实例都会存在then()方法,用于处理成功的回调;catch()方法用于捕获错误;

    • Promise.all() 方法

    具有并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调;

       allfunc1() {
          return new Promise((resolve, reject) => {
            setInterval(() => {
              const res =  {
                name: 'allFunc1',
                data: 1,
              }
              resolve(res)
            }, 100)
          })
        },
        allfunc2() {
          return new Promise((resolve, reject) => {
            setInterval(() => {
              let res =  {
                name: 'allfunc2',
                data: 2,
              }
              resolve(res);
            }, 200)
          })
        },
        allfunc3() {
          return new Promise((resolve, reject) => {
            setInterval(() => {
              const res =  {
                name: 'allFunc3',
                data: 3,
              }
              resolve(res)
            }, 100)
          })
        },
        trigerAll() {
          // 此处传递的是一个数组;
          Promise.all([this.allfunc1(), this.allfunc2(), this.allfunc3()]).then(res => {
            console.log('res: ', res);
          }).catch(error => {
            console.log('error:', error);
          })
        },
    
    // 会等到所有的异步请求都有了返回值之后才会输出结果;
    [{name: 'allFunc1', data: 1},{name: 'allfunc2', data: 2},{name: 'allfunc3', data: 3}] 
    
    • Promise.race()方法

    race()方法表示的是当有结果返回时, 就会输出结果,不用等到所有;

     trigerRace() {
          // 调用的方法同上;
          Promise.race([this.allfunc1(), this.allfunc2(), this.allfunc3()]).then(res => {
            console.log(res);
          }).catch(error => {
            console.log(error);
          })
        },
    // 输出结果
    {name: 'allFunc1', data: 1}
    

    参考
    Promise/A+

    相关文章

      网友评论

          本文标题:js - Promise

          本文链接:https://www.haomeiwen.com/subject/ellhwltx.html