async 和 promise的关系

156 阅读1分钟

async函数

async 函数可以把普通函数的返回值封装成一个 promise

async function foo() {
    return 1
}
// 等同于
function foo(){
    return Promise.resolve(1)      // 注意这是是resolve
}

当函数不存在返回值时,则也会返回一个promise其中 [[PromiseResult]]: undefined

await

提到 async 就需要说到 await,如果函数体内有一个await表达式,async函数就一定会异步执行。

async function foo() {
    await return 1
}
// 等同于
function foo(){
    return Promise.resolve(1).then(()=> undefined)      
}

await特性

  1. 必须在async函数中使用,不可单独使用,否则会报 SyntaxError 错误。

  2. async 函数中,存在 0 个或者多个 await,当执行到 await 时,函数将会暂停执行,直到 await 等待的promise的异步操作被兑现或被拒绝,才会恢复当前进程。

  3. 等待值为 promise 对象,当等待值不是 promise 对象时,会将等待值作为正常处理的 promise ,然后等待其结果

  4. promise 结果为异常时,抛出异常值。

使用async改造 promise函数

function getProcessedData(url) {
  return downloadData(url) // 返回一个 promise 对象
    .catch(e => {k
      return downloadFallbackData(url)  // 返回一个 promise 对象
    })
    .then(v => {
      return processDataInWorker(v); // 返回一个 promise 对象
    });
}
async function getProcessedData(url) {
  let v;
  try {
    v = await downloadData(url);
  } catch (e) {
    v = await downloadFallbackData(url);
  }
  return processDataInWorker(v);
}

总结

promise的出现是为了解决地狱回调,那么asyncawait的出现就是为了解决promise.then链过长的问题