es6的Promise对象

  1. Promise是js中进行异步编程的解决方案

  2. Promise是一个构造函数

  3. Pormise对象可以封装异步操作,并能够返回成功/失败的结果值

  4. 优点
    ① 支持链式调用,可以解决回调地狱(回调函数嵌套回调函数)的问题

  5. 基本写法

    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}`);
    });
    
  6. PromiseState:存储promise状态
    ① pending:未返回结果的状态
    ② resolved/fulfilled: 成功
    ③ rejected:失败

  7. new Promise((resolve, reject) => {}).then(res => {}, error => {})
    第一个为成功的回调,第二个为失败的回调

  8. new Promise((resolve, reject) => {}).catch(reject => {})
    失败的回调

  9. Promise.resolve(value)
    快速得到一个成功/失败的Promise对象

  10. Promise.reject(value)
    快速得到一个失败的Promise对象

  11. 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);
    

    在这里插入图片描述

  12. 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);
    

    在这里插入图片描述

  13. Promise.race([p1, p2])
    ① race有比赛的意思,返回值是第一个promise的结果
    ② 如果p1用定时器做了延时,那么p2就会先执行,最终的返回值是p2的值

  14. 给Promise指定多个then回调,状态相符的都会被执行

  15. 异常穿透:在链式调用的最后去指定异常的回调(catch),不管在中途哪个环节出现了错误,都会被最后的异常回调所识别到

  16. 中断Promise执行方式:return new Promise(() => {}); return一个等待状态的promise

  17. 案例:依次读取文件

    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('不管成功或失败,最终都会进入这个方法');
    });
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值