hzzzzzzzq / Blog

这是我记录博客的地方,希望能多写一些技术博客,JS、ES、React、Vue等
14 stars 0 forks source link

ES 6 系列 - 11. 三种异步之Async函数 #12

Open hzzzzzzzq opened 2 years ago

hzzzzzzzq commented 2 years ago

Async/await

介绍

async 函数时什么,其实就是 Generator 的语法糖,只需要将 * 改写成 asyncyield 改写成 await。 我们来看看 Generator 的写法,与 async 的写法。

const readFile = function (fileName, ms) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(fileName);
      resolve(fileName); // 需要给 `Promise` 一个状态转化,就是异步执行是否成功
    }, ms);
  });
};

function* genator() {
  yield readFile('fileName1', 1000);
  yield readFile('fileName2', 2000);
  yield readFile('fileName3', 3000);
  console.log('打印完毕');
}
const gen = genator();
gen.next(); // fileName1
gen.next(); // fileName2
gen.next(); // fileName3

async function asyncTest() {
  await readFile('fileName1', 1000);
  await readFile('fileName2', 2000);
  await readFile('fileName3', 3000);
  console.log('执行完毕');
}
asyncTest();
// fileName1
// fileName2
// fileName3
// 执行完毕

从上面我们可以看出,我们需要手动调用 next 方法,来执行下一步。 而 async 有自己内置执行器。

我们来看看 asyncGenerator 的改进。

asyncTest();

用法

返回 Promise 对象

async function useAsync() {
  // readFile 使用的是本文顶部的方法
  const result = await readFile('fileName', 1000);
  return result;
}
useAsync().then((value) => {
  console.log(value);
});
// fileName
// fileName
async function useAsync() {
  // readFile 使用的是本文顶部的方法
  const result = await Promise.reject('测试错误');
  console.log('打印?');
  return result;
}
useAsync()
  .then((value) => {
    console.log(value);
  })
  .catch((error) => {
    console.log(error);
  });
// 测试错误

await 命令

await 命令后面是一个 Promise 对象,返回结果。如果不是 Promise,就直接返回对应值。

const add = (a, b) => {
  return a + b;
};
async function useAsync() {
  const result = await add(1, 2);
  return result;
}
useAsync().then((value) => {
  console.log(value);
});
// 3

await 后面跟着 add 方法,算出一个数值 3,然后将值 return 出来。


简单的 await 使用方法,就是如此。