之前看了太多大约都不是官方文档看得自己晕乎乎, 直到今天决心用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(某个函数)  //在普通函数中也可以使用,应用范围更广些了

标签: none 阅读量: 1147

添加新评论