// setTimeout 示例
function callBack(){
console.log(‘执行完成’)
}
console.log(‘before setTimeout’)
setTimeout(callBack,1000)// 1秒后调用callBack函数
console.log(‘after setTimeout’)
运行后控制台输出结果为:
before setTimeout
after setTimeout
执行完成 //1秒后打印
上述定时器是在固定时间触发某个回调函数。
对于 ajax 网络请求就没有这么简单了,可能有多个网络请求是关联的,先执行某个请求返回结果后,第一个返回结果作为第二个请求的参数,调用第二个网络请求。如此,如果业务复杂,网络请求太多时,回调也很多,容易出现回调地狱。所以 Promise 出现了,专门解决异步回调地狱问题。
Promise 翻译成中文:承诺、保证。
通俗地讲,Promise 就像一个容器,里面存放着未来才会结束,返回结果的容器,返回的结果只需要在出口处接收就好了。从语法上讲,Promise 是一个对象,从它可以获取异步操作的消息。
二、Promise基本使用
下列用到的所有定时器模拟我们的 ajax 请求。
Promise 实例化的时候,传入的参数是一个函数,函数中接收两个参数:
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(‘123’)
},1000)
}).then(res=>{
console.log(res) //1秒后打印123
})
传入的 resolve 和 reject 本身都是函数。其作用分别为:
resolve - 把 Promise 的状态从进行中变为成功状态。
reject - 把 Promise 的状态从进行中变为拒绝状态。
Promise的三种状态:
pending :进行中,表示 Promise 还在执行阶段,没有执行完成。
fulfilled:成功状态,表示 Promise 成功执行完成。
rejected:拒绝状态,表示 Promise 执行被拒绝,也就是失败。
Promise 的状态,只可能是其中一种状态,从进行中变为成功或失败状态之后,状态就固定了,不会再发生改变。
Promise.then
执行 resolve 时,Promise 状态变为 fulfilled ,会执行 .then 方法。then 方法接收的参数也是一个函数,函数中携带一个参数,该参数是 resolve(res) 返回的数据。
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(‘哎呦喂’)
},1000)
}).then(res=>{
console.log(res) //1秒后打印哎呦喂
})
Promise.catch
执行 reject 时,Promise 状态从 pending 变为 rejected,会执行 catch 方法,catch 方法接收的也是一个函数,函数中携带一个参数,该参数为 reject(err) 返回的数据。
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
reject(‘error message’)
},1000)
}).then(res=>{
console.log(res)//不执行
}).catch(err=>{
console.log(‘err’,err)//1秒后打印 error message
})
三、Promise 链式调用
制作一个模拟网络请求:
-
第一次返回 a,
-
修改返回的结果为 aa,作为第二次网络请求返回的结果。
-
修改结果为 aaa,作为第三次返回结果。
const pp = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(‘a’)
},1000)
}).then(res=>{
console.log(‘res1’,res) //1秒后打印 a
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(res+‘a’)
},1000)
})
}).then(res=>{
console.log(‘res’,res) //2秒后打印 aa
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(res+‘a’)
},1000)
})
}).then(res=>{
console.log(‘res3’,res) //3秒后打印 aaa
})
这种场景其实就是接口的多层嵌套使用,Promise 可以把多层嵌套按照线性的方式进行书写,非常优雅。我们把 Promise 的多层嵌套调用就叫做链式调用。
上述实例,有三层嵌套就 new 了 3 个Promise,代码写得比较多,我们看看在实现功能的前提下如何能够简化。
四、Promise 嵌套使用的简写
promise传入的函数参数reject是一个非必传的参数,如果不需要处理失败时的结果时,我们可以省略掉 reject 。代码如下:
//简化1
const ppp = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(‘a’)
},1000)
}).then(res=>{
console.log(‘res1’,res)
return new Promise(resolve=>resolve(res+‘a’))
}).then(res=>{
console.log(‘res’,res)
return new Promise(resolve=>resolve(res+‘a’))
}).then(res=>{
console.log(‘res3’,res)
})
Promise 嵌套使用时,内层的 Promise 可以省略不写,所以我们可以直接把 Promise 相关的去掉,直接返回,代码如下:
//简化2
const pppp = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(‘a’)
},1000)
}).then(res=>{
return res+‘a’
}).then(res=>{
return res+‘a’
}).then(res=>{
console.log(‘res3’,res)
})
有的同学就在想,怎么都是成功状态的举例和简写,我们的失败状态catch可以简写吗?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
![](https://img-blog.csdnimg.cn/img_convert/7b6846bee865698e8759db1668236259.jpeg)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车
前端视频资料:
前端)**
![](https://img-blog.csdnimg.cn/img_convert/7b6846bee865698e8759db1668236259.jpeg)
最后
本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等
详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车
[外链图片转存中…(img-Jk48M8u1-1713248695923)]
前端视频资料: