对async、await的理解

112 阅读3分钟

定义

  • Async/Await可以让接口按顺序异步获取数据,用更可读,可维护的方式处理回调
  • 建立在Promises上,并且与所有现有的基于Promise的API兼容,async/await 其实是 Generator 的语法糖,它能实现的效果都能用then链来实现,它是为优化 then 链而开发出来的。从字面上来看, async 是“异步”的简写,await 则为等待,所以很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。当然语法上强制规定 await 只能出现在 asnyc 函数中

使用

  • async函数返回了一个Promise对象,如果在函数中直接return一个直接量,async会把这个直接量通过Promise.resolve()封装成一个Promise对象
  • async 函数返回的是一个 Promise 对象,所以在最外层不能用await 获取其返回值的情况下,当然应该用原来的方式:then() 链来处理这个 Promise 对象
  • 如果 async 函数没有返回值,它会返回Promise.resolve(undefined)
  • 在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致
  • Async—声明一个异步函数(async function someName(){...})
    • 自动将常规函数转换成Promise,返回值也是一个Promise对象
    • 只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
    • 异步函数内部可以使用await
  • Await—暂停异步的功能执行(var result = await someAsyncCall();)
    • 放置在Promise调用之前,await强制其他代码等待,直到Promise完成并返回结果
    • 只能与Promise一起使用,不适用于回调
    • 只能在async函数内部使用
  • 使用小贴士:async函数完全可以看作多个异步操作,包装成的一个 Promise对象,而await命令就是内部then命令的语法糖
//函数声明
async function foo(){
    //do something
}
//函数表达式
const foo = async function(){
    //do something
}
// 对象方法
let o = {
    async foo(){
        //do something
    }
}
o.foo().then(()=> console.log('do something reslove'))
// 箭头函数
const foo = async () => {
    // do something
}
//Class 使用
class Store {
    constructor() {
        this.cache = caches.open('msg')
    }
    async getMsg(msg) {
        const cache = await this.cache
        return cache
    }
}
fn2().then(r => {
  console.log(r) // 1
})
  • await是async wait的缩写,它等待返回的是一个表达式,不管是不是promise对象都可以,只是说如果返回的是promise对象执行的状态不一样而已,需要注意的是await只能在async函数中使用
function sync() {
  setTimeout(() => {
    return 1
  }, 1000)
}
async function async1(){
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(1)
    }, 2000)
  })
}
async function test(){
  await sync() //undefined
  console.log(1)
}
async function test2() {
  await async1()
  console.log(1)
}

test()
test2()
  • await的用法则相对简单了许多,他后面需要是一个Promise对象,如果不是则会被转成Promise对象。只要其中一个如果Promise对象变为reject状态,那么整个async函数都会中断操作。如果状态是resolve,那么他的返回值则会变成then里面的参数

------------------------------------------------------------------------------2024.5.16 每日一题