1.闭包
1.1什么是闭包
闭包就是能够读取其他函数内部变量的函数,在本质上是函数内部(局部变量)和函数外部(全局变量)链接的桥梁。
1.2闭包的用途
首先:可以读取函数内部的变量。
其次,可以让这些变量的值始终保持在内存中。
2.Promise详解
2.1promise的基本流程
2.2promise的基本使用
<script>
const p = new Promise((resolve,reject) => {
//执行异步操作
setTimeout(() => {
const time = Date.now() //如果当前时间是奇数代表成功,偶数代表失败
//如果成功了,调用resolve(value)
if(time%2===1){
resolve('成功的数据' + time)
}else{
//如果失败了,调用reject(reason)
reject('失败数据'+time)
}
},1000)
})
//通过promise的then()指定成功和失败的回调函数
p.then(
value=>{
console.log('成功的回调,value:',value)
},
reason=>{
console.log('失败的回调',reason)
}
)
</script>
2.3为什么要用Promise?
2.3.1指定回调函数的方式更加灵活
1.旧的:必须在启动异步任务前指定
2.promise:启动异步任务 =>返回promise对象 =>给promise对象绑定回调函数(甚至可以在异步任务结束后指定/多个)
2.3.2支持链式调用,可以解决回调地狱问题
回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件。
回调地狱不便于阅读、也不便于异常处理。
2.4如何使用Promise?
2.4.1API
1.Promise的构造函数:Promise(excutor){}
(1)excutor函数:执行器 (resolve,reject)=>{}
(2)resolve函数:内部定义成功时我们调用的函数 value=>{}
(3)reject函数:内部定义失败时我们调用的函数 reason=>{}
说明:excutor会在Promise内部立即同步回调,异步操作在执行器中执行
2.Promise.prototype.then方法:(onResolved,onRejected)=>{}
(1)onResolved函数:成功的回调函数 (value)=>{}
(2)onRejected函数:失败的回调函数(reason)=>{}
说明:指定用于得到成功value的成功回调和用于得到失败reason的失败回调返回一个新的promise对象。
3.Promise.prototype.catch方法:(onRejected)=>{}
(1)onRejected函数:失败的回调函数(reason)=>{}
说明:then()的语法糖,相当于:then(undefined,onRejected)
4.Promise.resolve方法:(value)=>{}
(1)value:成功的数据或promise对象
说明:返回一个成功/失败的promise对象
5.Promise.reject方法:(reason)=>{}
(1)promises:包含n个promise的数组
说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态。
2.4.2Promise的几个关键问题
1.如何改变promise的状态?
(1)resolve(value):如果当前是pendding就会变成resolved
(2)rejected(reason):如果当前是pendding就会变成rejected
(3)抛出异常:如果当前是pedding就会变成rejected
2.一个promise指定多个成功/失败回调函数,都会调用吗?
当promise改变为对应状态时都会调用。
3.改变promise状态和指定回调函数谁先谁后?
(1)都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调
(2)如何先改变状态再指定回调?1.在执行器中直接调用resolce()/reject()2.延迟更长时间才调用then()
(3)什么时候才能得到数据?1.如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据。2.如果仙女改变的状态,那当指定回调时,回调函数就会调用,得到数据。
4.promise.then()返回的新promise的结果状态由什么决定?
(1)简单表达:由then()指定的回调函数执行的结果决定。
(2)详细表达:1.如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常。2.如果返回的是非 promise 的任意值, 新 promise 变为 resolved, value 为返回的值。3.如果返回的是另一个新 promise, 此 promise 的结果就会成为新 promise 的结果。
5.promise如何串联多个操作任务?
(1)promise的then()返回一个新的promise,可以开成then()的链式调用。
()通过then的链式调用串联多个同步/异步任务。
6.promise异常穿透?
(1)当使用promise的then链式调用时,可以在最后指定失败的回调。
(2)前面任何操作出了异常,都会传到最后失败的回调中处理。
7.中断promise链?
(1)当使用promise的then链式调用时,在中间中断,不再调用后面的回调函数。
(2)办法:在回调函数中返回一个pendding状态的promise对象。
3.async与await
3.1async函数
1.函数的返回值为promise对象
2.promise对象的结果由async函数执行的返回值决定。
3.2await表达式
1.await右侧的表达式一般为promise对象,但也可以是其它的值。
2.如果表达式是promise对象,await返回的是promise成功的值。
3.如果表达式是其他值,直接将此值作为await的返回值。
3.3注意
1.await必须写在async函数中,但async函数中可以没有await
2.如果await的promise失败了,就会抛出异常,需要通过try...catch捕获处理。