JS的Promise async await
之前看了太多大约都不是官方文档看得自己晕乎乎, 直到今天决心用MDN看看
使用Promise
Promise对象的构造器
const p = function(param){
new Promise((callItWhenResolved, callItWhenRejected)=>{
if(doSomethingOk){callItWhenResolved(resovledResultAsParam)}
else{callItWhenRejected(rejectedResultAsParam)}
})
}
p(Real_param).then(function callItWhenResovled(resovledResultAsParam){})
所以Promise构建的函数,具体来说就是返回一个promise对象的函数. 这个函数的主要操作完成后, 在promise对象的构造器中根据操作结果执行resolved()函数或者rejected()函数.这两个回调函数放在p().then()中定义.
async await只是Promise的语法糖.
async function af(){
function callItWhenResovled(resovledResultAsParam){}
callItWhenResovled(await p(Real_param))
}
也能合并简写为:
async function af(){
(function callItWhenResovled(resovledResultAsParam){})(await p(Real_param))
}
如果callItWhenResovled已经定义过,当然又可以省却定义的过程,例如console.log
async function af(){
console.log(await p(Real_param))
}
所以: await aPromiseObject
,得到的是正常完成后的返回值resovledResultAsParam. 这个返回值会输入callItWhenResovled函数作为参数,并执行callItWhenResovled.
这儿特别晕的地方就是, 回调函数callItWhenResovled的参数, 表面上是aPromiseObject在await等待的返回值resovledResultAsParam, 实际上这个返回值在Promise对象构建的时候,并没有一个return resovledResultAsParam
, 却是以callItWhenResovled实参的方式提供返回值的callItWhenResovled(resovledResultAsParam)
. 这个透过输入实参造成输出return的效果确实让人好晕.
所以async函数干脆在函数尾部使用return 返回值
来替代这种回调函数(实参返回值)
,使得这个逻辑一下子清晰了很多. 而其返回的实质相当于return new Promise((resolved)=>{resolved(返回值)})
.
而await的作用,就是进行Promise的脱壳,将一个promise对象变成其resolved返回值. await 异步函数()
相当于异步函数返回的Promise对象.then()
, 而某个函数(await 异步函数())
相当于异步函数返回的Promise对象.then(某个函数)
.
这儿有个重要区别:
某个函数(await 异步函数()) //只能在async函数内使用await
异步函数返回的Promise对象.then(某个函数) //在普通函数中也可以使用,应用范围更广些了