-
Promise是js中进行异步编程的解决方案
-
Promise是一个构造函数
-
Pormise对象可以封装异步操作,并能够返回成功/失败的结果值
-
优点
① 支持链式调用,可以解决回调地狱(回调函数嵌套回调函数)的问题 -
基本写法
new Promise((resolve, reject) => { // 封装异步任务 setTimeOut(() =>{ const num = Math.ceil(Math.random() * 10); if (num > 5) { resolve(num); } else { reject(num); } }, 2000); }).then(res => { console.log(`值大于5,值为${res}`); },error => { console.log(`值小于等于5,值为${error}`); });
-
PromiseState:存储promise状态
① pending:未返回结果的状态
② resolved/fulfilled: 成功
③ rejected:失败 -
new Promise((resolve, reject) => {}).then(res => {}, error => {})
第一个为成功的回调,第二个为失败的回调 -
new Promise((resolve, reject) => {}).catch(reject => {})
失败的回调 -
Promise.resolve(value)
快速得到一个成功/失败的Promise对象 -
Promise.reject(value)
快速得到一个失败的Promise对象 -
Promise.all([p1, p2])
① 传入的所有promise都为成功时,返回的Promise状态才为成功,结果为每个promise返回值的数组
② 传入的promise有一个为失败时,res状态就为失败,结果为第一个失败的promise返回值const p1 = new Promise((resolve, reject) => { resolve('hello'); }); const p2 = new Promise((resolve, reject) => { resolve('world'); }); const result = Promise.all([p1, p2]); console.log(result);
-
Promise.allSettled([p1, p2]);
① 同Promise.all(),参数也是传入一个数组
② 二者区别是返回值不同,Promise.allSettled([p1, p2])返回的始终是一个成功的Promise,但是返回值是一个包含每个promise状态、结果的数组const p1 = new Promise((resolve, reject) => { resolve('hello'); }); const p2 = new Promise((resolve, reject) => { reject('world'); }); const result = Promise.allSettled([p1, p2]); console.log(result);
-
Promise.race([p1, p2])
① race有比赛的意思,返回值是第一个promise的结果
② 如果p1用定时器做了延时,那么p2就会先执行,最终的返回值是p2的值 -
给Promise指定多个then回调,状态相符的都会被执行
-
异常穿透:在链式调用的最后去指定异常的回调(catch),不管在中途哪个环节出现了错误,都会被最后的异常回调所识别到
-
中断Promise执行方式:return new Promise(() => {}); return一个等待状态的promise
-
案例:依次读取文件
const fs = require('fs'); new Promise((resolve, reject) => { fs.readFile('./text1.txt', (err, data) => { if (err) reject(err); resolve(data); }); }).then(res => { console.log('读取的第一个文件内容:' + res); return new Promise((resolve, reject) => { setTimeout(() => { fs.readFile('./text2.txt', (err, data) => { if (err) reject(err); resolve(data); }); }, 3000); }); }).then(res => { console.log('3s后读取的第二个文件内容:' + res); return new Promise((resolve, reject) => { fs.readFile('./text3.txt', (err, data) => { if (err) reject(err); resolve(data); }); }); }).then(res => { console.log('读取的第三个文件内容:' + res); }).catch(err => { // 中途某个环节出错,就会走这个catch方法(异常穿透) console.warn(err); }).finally(_ => { console.log('不管成功或失败,最终都会进入这个方法'); });
es6的Promise对象
于 2023-03-06 14:04:27 首次发布