JavaScrpt Promise
【摘要】
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)