- 2021-01-05
在ES6语法中,promise是一个比较重要的知识点,在这里记录一下。
ES6这本书我自己也买了,但是一直没能静下心来从头到尾看一遍,现在先捡重点的写一下,后面慢慢看能不能补齐吧。
一、promise是什么
promise是解决异步的一种方法,里面保存着异步操作的结果和对应应执行的事件。
从语法上来说,promise是一个对象,从它可以获取异步操作的消息。promise提供统一的API,各种异步操作都可以用同样的方法进行处理。
二、promise的特点
- 对象的状态不受外界影响。
promise对象一共有三种状态,分别是Pending(进行中)、Fulfilled(已成功)和Rejected(已失败)。只有异步操作的结果能决定他当前是哪一个状态,任何其他操作都无法改变这个状态。 - 一旦状态改变就不会再变,任何时候都可以得到这个结果。
promise对象只能是从Pending(进行中)变为Fulfilled(已成功)或Rejected(已失败)。当这两种情况发生了,状态就凝固了,称为Resolved(已定型)。这个时候如果再对promise对象添加回调函数,也会立即得到这个结果。
三、promise的优缺点
优点:
- 可以将异步操作用同步操作的流程表达出来,避免了层层嵌套的回调函数。
- promise提供统一的接口,使得控制异步操作更加方便。
缺点
- 无法取消promise,一旦新建就会立即执行。
- 如果不设置回调函数,promise内部抛出的错误不会反应到外部。
- 处于Pending(进行中)状态是,无法得知目前进展到哪一个阶段(刚开始还是即将完成)。
四、promise的基本用法
我们先来创建一个promise实例:
(ES6规定,promise对象是一个构造函数,用来生成promise实例。)
var promise = new Promise(function(resolve, reject){
//在这里写异步操作
if(/*异步操作成功*/){
resolve(value);
}else{
reject(error);
}
});
- promise构造函数接收resolve和reject两个函数作为参数。他们由JavaScript引擎提供,不用自己部署。
- 异步操作成功是,会将操作结果作为参数传入 resolve 函数并执行,将promise对象的状态从Pending(未完成)变为Fulfilled(成功)。
- 异步操作失败时,会将结果作为参数传入 reject 函数并执行,将promise对象的状态变为Rejected(失败)。
- promise实例生成之后,可以用 then 方法分别指定 Resolved 和 Rejected 状态下的回调函数。
promise.then(function(value){
// success
}, function(error){
// failure
});
- then 方法可以接收两个回调函数作为参数,第一个是成功状态下调用(必选),第二个在失败状态下调用(可写可不写)。
五、简单实例
let promise = new Promise(function(resolve, reject){
console.log('Promise 初始化');
resolve();
});
promise.then(function(){
console.log('resolved');
});
console.log('test');
- promise新建之后会立即执行,所以先输出 ’ Promise 初始化 '。
- 然后输出 ’ test '。
- then方法制定的回调函数将在当前脚本所有同步任务执行完成之后才会执行,所以最后输出 ’ resolved '。