ES6的Promise浅析

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

  Promise就是一个对象,Promise 构造函数接受一个函数(后称函数p)作为参数,函数p的两个参数分别是 resolve reject ,它们是两个函数

// 第一步:定义一个Promise对象
const promise = new Promise(function(resolve, reject) {   // 封装一些异步调用操作 
if (/* 异步操作成功 */){
    resolve(value); //这句是不可少的,这里的value就是异步操作的结果,当这个代码被调用,就相当于返回了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'会作为参数传递给 resolve ,因为setTimeout的第三个参数作用就是给setTimeout第一个函数的参数
            });
     }

//异步调用成功后then后面的第一个函数会被执行 timeout(
100).then((value) => { //此处的参数value 是由 Promise中的异步处理逻辑执行后的返回值 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 方法

这里做个总结:   

      每个Promise实例封装了一个异步调用,通过两个参数 resolve 和 reject 来封装处理成功和失败的返回值(如果有的话)以及回调处理,而这个then方法其实是为了解决嵌套回调的,每个then调用都会返回一个

Promise对象,相当于又是一个异步调用,用这种链式

的代码结构替代了以前的嵌套的代码结构。(写到这里,脑子一片清凉感觉出来)

 

以上的 Promise.then机制 也可以用async/await来替代,async/await的目的为了简化使用基于promise的API时所需的语法。

但一定注意区别:

  1. await后面接一个会return new promise的函数并执行它
  2. await只能放在async函数里

 

 

 

 

 




posted @ 2018-08-29 16:16  杭州胡欣  阅读(262)  评论(1编辑  收藏  举报