1、Promise是什么?
Promise是ES6新增的一个构造函数,用来解决开发中的回调地狱问题.
回调地狱
:异步回调 层层嵌套
2、状态
promise对象仅有三种状态:
- pending(进行中)
- fulfilled(已成功)
- rejected(已失败)
Promise对象是一个构造函数,用来生成Promise实例
const promise = new Promise(function(resolve, reject) {});
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject
- resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”
- reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”
promise本身并没有改变异步的顺序, 而是通过操作异步结果的顺序从而
间接
控制异步的顺序.
3、工作流程
当我们创建promise
的时候,它就会立即执行里面的异步代码,此时它的状态是进行中
,然后剩下两种状态是由异步本身决定的,分别对应的是异步操作的成功和失败,当成功或失败之后,promise的状态就会发生改变,从进行中到成功(从pending变为fulfilled
)或者从进行中到失败(从pending变为rejected
),这时候就会分别调用它的resolve()和reject()方法来处理异步的结果,resolve()
就会执行promise实例的then
方法,reject
就会执行promise实例的catch()
方法,这就是整个流程。
4、静态方法
- reslove()
resolve:异步操作 成功状态===>调用
.then
方法
- reject()
reject : 异步操作 失败状态===>调用
.catch
方法
- all()
const fs = require("fs");
/*
1. promise实例对象的all方法 : 将多个Promise合并成一个Promise
* 所有异步全部执行完毕才会执行then方法
2. 解决需求: a , b , c 同时执行完毕
*/
//1.封装一个函数 : 根据文件名生成 文件读取的promise
function getPromise(fileName) {
let p = new Promise((resolve, reject) => {
//读文件
fs.readFile(`./data/${fileName}.txt`, 'utf-8', (err, data) => {
if (err == null) {
//成功
resolve(data);
} else {
//失败
reject(err);
}
});
});
return p;
};
//2.解决需求: a , b , c 同时执行完毕
let pa = getPromise('a');
let pb = getPromise('b');
let pc = getPromise('c');
//将三个异步操作合并成一个Promise
let pAll = Promise.all([pa,pb,pc]);
//开始读取a
// 三个promise都成功后,才去执行pAll.then的第一个方法.
// 只要有一个失败了,就去执行catch里面的函数.
pAll.then((data)=>{
console.log(data);//data是一个数组,存储每一个promise的成功结果
}).catch((err)=>{
console.log(err);
});
将多个promise实例合并成一个promise,只有所有的promise全部执行成功后才会执行then,promise.all调用成功返回的结果是每个promise单独调用成功之后返回的结果组成的
数组
,如果调用失败的话,返回的则是第一个reject
的结果
- race()
const fs = require("fs");
/*
1. promise实例对象的race方法 : 将多个Promise合并成一个Promise
* 任何一个异步 执行完毕就会执行then方法
2. 解决需求: a , b , c 任意一个成功
*/
//1.封装一个函数 : 根据文件名生成 文件读取的promise
function getPromise(fileName) {
let p = new Promise((resolve, reject) => {
//读文件
fs.readFile(`./data/${fileName}.txt`, 'utf-8', (err, data) => {
if (err == null) {
//成功
resolve(data);
} else {
//失败
reject(err);
}
});
});
return p;
};
//2.解决需求: a , b , c 同时执行完毕
let pa = getPromise('a');
let pb = getPromise('b');
let pc = getPromise('c');
//将三个异步操作合并成一个Promise
let pAll = Promise.race([pa,pb,pc]);
//开始读取a
// 三个promise任何一个成功,就去执行pAll.then的第一个方法. (一旦成功一个,其他不再执行)
pAll.then((data)=>{
console.log(data);//data是第一个执行成功的primise异步结果
}).catch((err)=>{
console.log(err);
});
将多个promise实例合并成一个promise,任意promise执行成功就会执行then,返回的结果则是所有promise实例中
最先返回的结果
,不关心是成功还是失败.
5、实例方法
- then()
then是实例状态发生改变时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数
then方法返回的是一个新的Promise实例,也就是promise能链式书写的原因
promise对象.then((res)=>{ 处理成功数据 },(err)=>{ 处理失败信息 });
- catch()
catch()方法是.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数 - finally()
finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作