• ES6的Promise浅析


      Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。 它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。

      Promise就是一个对象,Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolve reject 。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

    // 第一步:定义一个Promise对象
    const promise = new Promise(function(resolve, reject) {   // 封装一些异步调用操作 
    if (/* 异步操作成功 */){
        resolve(value); //这句是不可少的
      } else {
        reject(error);
      }
    });

    // 第二步:定义一个函数
    var myFun = function(){
    return promise ; //返回一个promise对象
    }

    // 第三步:正式使用Promise
    myFun.then( function(value) {
        // 异步执行成功时自动调用
    }, function(error) {
        // 异步执行失败时自动调用
    });
    // then 方法可以接受两个回调函数作为参数。第一个回调函数是 Promise 对象的状态变为 resolved(成功) 时调用,第二个回调函数是 Promise 对象的状态变为
    // rejected(失败)时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受 Promise 对象传出的值作为参数。

    resolve 函数的作用是,将 Promise 对象的状态从未完成变为成功(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

    reject 函数的作用是,将 Promise 对象的状态从未完成变为失败(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。


    上面都是纸上谈兵,下面用一个小例子真实体验一下:

     
         function timeout(ms) {
                return new Promise((resolve, reject) => {
                    console.log('-------异步处理中-----------') ;
                    setTimeout(resolve, ms, 'done');   //第三个参数'done'会作为参数传递给setTimeout
                });
         }
    
    //异步调用成功后then后面的第一个函数会被执行 timeout(
    100).then((value) => { console.log(value); });

    执行后输出:

       -------异步处理中-----------

      done

    Promise完全改变了js异步编程的写法,让异步编程变得十分的易于理解,特别是出现异步的嵌套回调时,使用Promise可以用链式的代码结构替代传统的事件监听或回调函数的方式。例如上面的代码如果出现嵌套回调时,then里面的函数就应该写成返回一个Promise,代码结构会如下:

    timeout(100)
         .then( (value) => {  
              .....
         })//返回Promise对象

    .then( (value) => {
    .....
    })
    //返回Promise对象
        .then( (value) => { 
    ......
    }); //返回Promise对象
    
    

     then 方法返回的是一个新的 Promise 实例(注意,不是原来那个 Promise 实例)。因此可以采用链式写法,即 then 方法后面再调用另一个 then 方法




  • 相关阅读:
    Error: Client network socket disconnected before secure TLS connection was established
    python对文章词频的统计
    IntelliJ IDEA创建java空项目
    java提取docx文件中的图片
    vue v-for 循环复选框-默认勾选第一个的实现方法
    nodejs的request创建的get和post请求,带参数
    python list转换字符串报错TypeError: sequence item 0: expected str instance, int found
    linux常用命令
    ES9(2018) 正则表达式命名捕获组
    ESLint+Prettier代码规范实践
  • 原文地址:https://www.cnblogs.com/hzhuxin/p/9555082.html
Copyright © 2020-2023  润新知