ES6之Promise

1. 什么是Promise

Promise是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行

2. Promise 的优点

const test=(args,callback)=>{  
    if(args && callback && typeof callback ==='function'){ callback(); }
};  

test('test',()=>console.info('this is a callback'));  

我们一定见过如上的代码,但是如果回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——回调地狱。

promise是用来解决两个问题的:

回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
promise 可以支持多个并发的请求,获取并发请求中的数据
这个promise可以解决异步的问题,本身不能说promise是异步的

3. Promise 的用法

const promise = new Promise(function(resolve, reject){ 
    setTimeout(function(){  
        console.log('执行完成Promise');  
        Math.round(Math.random())?resolve('执行成功'):reject('执行失败');  
    }, 2000);
});

其执行过程是:执行了一个异步操作,也就是 setTimeout,2秒后,输出“执行完成”,然后随机调用resolve或者reject方法。

Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数:

  • resolve :异步操作执行成功后的回调函数
  • reject:异步操作执行失败后的回调函数

3.1 then 链式操作的用法

所以,从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

 promise.then((data) => {
     console.log('resolved', data);
 }).then((data) => {
     console.log('resolved', data);
 }).then((data) => {
     console.log('resolved', data);
 });

3.2 catch 的用法

我们知道 Promise 对象除了 then 方法,还有一个 catch 方法,它是做什么用的呢?其实它和 then 的第二个参数一样,用来指定 reject 的回调。用法是这样:

promise.then((data) => {  
    console.log('resolved',data);  
}).catch((err) => {  
    console.log('rejected',err);  
});  

3.3 all 的用法

Promise.all 可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

说白了就是谁跑的慢,以谁为准执行回调。

const p1 = new Promise(function(resolve, reject){})
const p2 = new Promise(function(resolve, reject){})
const p3 = new Promise(function(resolve, reject){})  
let p = Promise.all([p1, p2, p3]);  

p.then(function(data) {  
    console.info('success',data);  
}).catch(function(err) {  
    console.error('error',err);  
});  

只有当 p1,p2,p3 都成功才会执行then,有任意一个promise失败都会执行catch

3.4 race 的用法

race 就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

const p1 = new Promise(function(resolve, reject){})
const p2 = new Promise(function(resolve, reject){})
const p3 = new Promise(function(resolve, reject){})  
let p = Promise.race([p1, p2, p3]);  

p.then(function(data) {  
    console.info('success',data);  
}).catch(function(err) {  
    console.error('error',err);  
});  

文章作者: Emil
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Emil !
评论
 上一篇
Ubuntu Nginx 安装免费SSL证书 Ubuntu Nginx 安装免费SSL证书
安装 nginx更新 apt 源,安装 nginx 服务sudo apt-get update sudo apt-get install -y nginx安装certbotcertbot 是维护 Let’s Encrypt 的 Packag
2019-06-02
下一篇 
Spring-项目架构 Spring-项目架构
什么是 Spring我们看一下 Spring 官网如何介绍:Spring框架为现代基于 java 的企业应用程序提供了一个全面的编程和配置模型,适用于任何类型的部署平台。Spring的一个关键元素是应用程序级别的基础设施支持:Spring专
2019-05-01
  目录