JavaScrpt Promise

举报
福州司马懿 发表于 2021/11/19 02:20:14 2021/11/19
【摘要】 ECMAscript 6 原生提供了 Promise 对象 Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。它共,有三种状态: pending: 初始状态,不是成功或失败状态。f...

ECMAscript 6 原生提供了 Promise 对象

Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。它共,有三种状态:

  • pending: 初始状态,不是成功或失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

Promise的构造函数接收一个函数,该函数有两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。

resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。

Promise 根据传递的参数不同,有两种构造方式

  • new Promise(function(resolve, reject) {})
  • Promise.resolve(obj)

代码示例

const p1 = new Promise((resolve, reject)=>{
	console.log(new Date() + " Promise1 开始执行...");
	setTimeout(()=>{
		console.log(new Date() + " Promise1 timeout 事件触发");
		if(Math.random() > 0.5) {
			resolve("ok 1");
		} else {
			reject("fail 1");
		}
		console.log(new Date() + " Promise1 timeout 事件结束");
	}, 500);
	console.log(new Date() + " Promise1 执行完毕!");
});
const obj = {
	then: (resolve, reject)=>{
		console.log(new Date() + " Promise2 开始执行...");
		setTimeout(()=>{
			console.log(new Date() + " Promise2 timeout 事件触发");
			if(Math.random() > 0.5) {
				resolve("ok 2");
			} else {
				throw "fail 2-1";
			}
			console.log(new Date() + " Promise2 timeout 事件结束");
		}, 500);
		throw "fail 2-2";
		console.log(new Date() + " Promise2 执行完毕!");
	}
}
const p2 = Promise.resolve(obj);

const p3 = Promise.resolve("ok3");
//等价于
const p4 = new Promise(resolve=>resolve("ok4"));

console.log(p1);
console.log(p2);
console.log(p3);
console.log(p4);

setTimeout(()=>{
	p1.then(resolveData=>{
			console.log(new Date() + " " + resolveData);
			console.log(p1);
		}, rejectError=>console.warn(new Date() + " " + rejectError)
	).catch(err=>console.warn(new Date() + " catch " + err));
	p2.then(resolveData=>{
			console.log(new Date() + " " + resolveData);
			console.log(p2);
		}, rejectError=>console.warn(new Date() + " " + rejectError)
	).catch(err=>console.warn(new Date() + " catch " + err));
}, 1000);

console.log("主线程执行完毕");

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

正常的情况

  • Promise 内的代码在声明时,就立即执行了
  • Promise 内的代码是异步执行的
  • 当传递给 Promise 的参数是 “函数” 或 “存在 then(resolve, reject)” 时,Promise 的 state 是 “pending”,再次调用 Promise 的 then 方法后才会变为 “fulfilled”
  • 当传递给 Promise 的参数是 “对象”且该对象不存在 then 方法“ 时,Promise 的 state 是 “fulfilled”,该对象会赋给 Promise 的 value 属性

在这里插入图片描述

异常的情况

有两点需要主意的:

  • throw 抛出异常之后,如果该异常被捕获,那么会执行后续程序
  • 如果该异常是在setTimeout中被抛出的,由于两者并不是一个消息循环,所以不会被捕获,因此它的后续代码也不会被执行。
    在这里插入图片描述

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/87378931

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。