ES6之Promise
ES6之Promise
是ES6引入的异步编程的新解决方案,非常重要。
单个异步任务可能看不出来优势,但当多个时,链式调用是很好用的
- 语法上Promise是一个构造函数,所以我们需要结合new关键字来使用,它需要传一个函数作为参数,函数的形参是resolve和reject
<script>
new Promise((resolve, reject) => {
setTimeout(()=>{
resolve(111)
},3000)
}).then(value => {
console.log(value);
}, reason => {
console.log(reason)
})
</script>
-
Promise.prototype.then()
then方法是Promise原型上的方法,所以new Promise()后能直接调用then()方法,因为实例肯定能调用原型上的方法。
只有在调用了resolve方法之后,才会触发then后面的第一个方法
只有在调用了reject方法之后,才会触发then后面的第二个方法
调用了这两个方法,相当于改变了Promise的一个状态
那为什么能一直调用then()呢?是因为then()的返回结果是Promise类型的对象,我们才可以一直调用then方法,即链式调用。其实then()返回的那个Promise对象里面,有记录它此刻的一个状态。
状态(PromiseStatus)取决于then(() => {})这个回调里面的return值
return值有如下三种情况
1、如果是非Promise类型的属性,那么状态是成功,比如:
const p = new Promise((resolve, reject) => { resolve() }); const result = p.then(value => { //因为这里没有返回值嘛,所以默认返回的是undefined,不属于Promise类型,所以状态是成功 }, reason => { }); console.log(result); //一个Promise对象,它里面的状态是成功
2、如果是Promise类型的属性,那么由Promise决定
const p = new Promise((resolve, reject) => { resolve() }); const result = p.then(value => { return new Promise((resolve, reject) => { reject() //触发失败状态 }) }, reason => { }); console.log(result); //一个Promise对象,它里面的状态是失败
3、如果在then()里面是抛出错误的话,那么状态也是失败
💛 现在应该能明白当多个then()连用时,该执行它里面的哪个回调了吧?由状态决定
这一路,灯火通明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通