reject(111);
console.log(\\\"line 24:\\\", p);
}, 2000)
})
console.log(\\\"line 27:\\\", p);
结果依次为:
line 27: Promise {}
...2s后
line 24: Promise {: 111}
报错: 2.html:60 Uncaught (in promise) 111 (可以不用理会 后面会被then() / catch() 方法捕获)
resolv e() 和 reject() 方法,在异步代码中调用:由于JS是单线程,会优先在主线程执行同步代码,异步代码会放到任务队列中,所以在页面加载时,,Promise实例为pending(进行中)状态,等待主线程执行完毕,任务队列通知主线程,异步任务可以执行了,该任务才会进入主线程执行 。
此时setTimeout中的回调函数被调用,执行了resolve() 或 reject() 方法,Promise实例会随之改变状态,并存储传入的数据 。
那么resolve() reject() 方法,可以重复调用么?
这就要讲到Promise的第二大特征:一旦状态改变,就不会再变,任何时候都可以得到这个结果 。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected 。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型) 注意,为了行文方便,本章后面的resolved统一只指fulfilled状态,不包含rejected状态 。
由此可见Promise本质,就是一个状态机,当该Promise对象创建出来之后,其状态就是pending(进行中),然后通过程序来控制到底是执行已完成,还是执行已失败 。
因为Promise处理的是异步任务,所以我们还得对Promise做监听,当Promise的状态发生变化时,我们要执行相应的函数(then catch finally) 。
Promise的动态方法
所谓Promise动态方法,即将封装的方法存储在Promise的原型对象(prototype)上,供所有通过构造函数创建的实例化对象使用 。
Promise.prototype.then()
Promise 实例具有then方法,它的作用是为 Promise 实例添加状态改变时的回调函数,前面说过 Promise实例的状态可以从pending(进行中) 变为 fulfilled(已成功)或rejected(已失败),所以then方法中接收两个回调函数(它们都是可选的) 。
p.then(resolveHandler,rejectHandler)
resolveHandler 第一参数,用于指定Promise实例,由pending(进行中) 变为 fulfilled(已成功)时执行的回调函数 。
rejectHandler 第二参数,用于指定Promise实例,由pending(进行中) 变为 rejected(已失败)时执行的回调函数 。
可以理解为 then()方法中的两个回调函数,提前规定好了状态改变时需要执行的内容,等待以后Promise实例的状态之后再执行对应的回调函数 (本质还是回调函数,要用魔法打败魔法) 。
注意:resolveHandler rejectHandler 中可以传入一个形式参数 接收Promise实例中存储数据 。
// 等待两秒后 随机一个0-1的数,如果 num>=0.5 就变为fulfilled,否则变为rejected
var p = new Promise(function (resolve, reject) {//形式参数
setTimeout(function () {
var num = Math.random();
if (num >= 0.5) {
resolve(111)
} else {
reject(2222);
}
console.log(\\\"line 24:\\\", p);
}, 2000)
})
console.log(\\\"line 27:\\\", p);
p.then(function (arg) {
console.log(\\\"line 50\\\", arg);
}, function (arg) {
console.log(\\\"line 52\\\", arg);
})
情况1: (num>=0.5)
line 27: Promise {}
...2秒后
line 24: Promise {: 111}
line 50 111
情况2: (num<0.5)
line 27: Promise {}
...2秒后
2.html:81 line 24: Promise {: 2222}
2.html:89 line 52 2222
解析:在异步代码中调用: 由于JS是单线程,会优先在主线程执行同步代码,异步代码会放到任务队列中,所以
- Promise创建完毕,Promise实例为pending(进行中)状态;
- 调用 then()方法,传入两个回调函数,提前规定好了状态改变时需要执行的内容,等待以后Promise实例的状态之后再执行对应的回调函数;
- 等待主线程执行完毕,任务队列通知主线程,异步任务可以执行了,该任务才会进入主线程执行 。=> 随机一个0-1的随机数,根据结果改变Promise实例的状态,存储传入的数据 => 执行then方法中对应的回调函数 。
var p = new Promise(function (resolve, reject) {//形式参数
setTimeout(function () {
resolve(1);
}, 2000);
})
p.then(function (num) {
- 12月是什么星座 十二月份有什么花开放
- 张学友和张家辉到底是什么关系[张学友和黄家驹]
- 正规乒乓球比赛规则详细流程大全 乒乓球的比赛规则是什么
- 企业常用的8中推广方式 互联网网络推广是什么
- 淘宝会员名是淘宝账号吗 淘宝会员名是什么
- 牛西冷是什么部位
- 平板电脑二合一是什么意思
- hrd是什么职位的简称 hrd是什么岗位
- 荧光材料的发光原理是什么 没有光源荧光材料会不会发光
- 101是什么意思 101事件真相知乎