关于async/await的小悟

关于async/await的小悟

  • 需要具备的前置知识
  • 对于 async/await 理解

需要具备的前置知识

对于 async/await 理解

简述

带 async 的函数(async function fn(){}),会返回 Promise 函数

  • 如果 fn 返回的是 promise,就直接返回该 promise
  • 如果 fn 返回的不是 promise,则调用 Promise.resolve()转成 promise 后返回

await 相当于 promise 构造函数中的 resolve 参数

  • await 只能在 async 中使用,而 resolve 在 promise 构造函数中使用
  • await 等待到的右侧表达式(promise 或其他)的值将作为 promise 中的终值(value)
  • await 运算符是个从右往左运算的运算符
    • resolve 函数调用时也要先计算参数表达式的值
    • 反向思考,如果不先计算右侧表达式,那么 await(等待)的表达式就没有触发的时机啦
  • await 和 resolve 不同的地方就是 await 会把后面的所有操作都“转移”到 then 中操作,因为 await 具有阻塞的效果

表达式表示

async function fn(){
code1...;
const value=await fn2();
code2...;
}
复制代码

类等于

new Promise(resolve=>{
code1...;
resolve(fn2());
}).then(value=>{
code2...;
})
复制代码

示例比较打印是否相同

  • 示例 1(同步方法):
function syncFun() {
  console.log('syncFun start')
  return 'value'
}
async function asyncFun() {
  console.log('async start')
  const value = syncFun()
  console.log('value=' + value)
  console.log('async end')
}
asyncFun()
console.log('main end')
复制代码
function syncFun() {
  console.log('syncFun start')
  return 'value'
}
new Promise(resolve => {
  console.log('promise start')
  const value = syncFun()
  console.log('value=' + value)
  console.log('promise end')
})
console.log('main end')
复制代码
  • 示例 2(异步方法-接收数值):
function syncFun() {
  console.log('syncFun start')
  return 'value'
}
async function asyncFun() {
  console.log('async start')
  const value = await syncFun()
  console.log('value=' + value)
  console.log('async end')
}
asyncFun()
console.log('main end')
复制代码
function syncFun() {
  console.log('syncFun start')
  return 'value'
}
new Promise(resolve => {
  console.log('promise start')
  resolve(syncFun())
}).then(value => {
  console.log('value=' + value)
  console.log('promise end')
})
console.log('main end')
复制代码
  • 示例 3(异步方法-接收 promise):
async function syncFun() {
  console.log('syncFun start')
  return 'value'
}
async function asyncFun() {
  console.log('async start')
  const value = await syncFun()
  console.log('value=' + value)
  console.log('async end')
}
asyncFun()
console.log('main end')
复制代码
async function syncFun() {
  console.log('syncFun start')
  return 'value'
}
new Promise(resolve => {
  console.log('promise start')
  resolve(syncFun())
}).then(value => {
  console.log('value=' + value)
  console.log('promise end')
})
console.log('main end')
复制代码

后话

没看过 async/await 的源码,只是根据使用的时候的直觉而写,如有不妥之处,欢迎指正(欢迎加微信 772345373)

转载于:https://juejin.im/post/5cee15296fb9a07eec59ac79