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 方法




原文地址:https://www.cnblogs.com/hzhuxin/p/9555082.html