async

async 函数不论有没有什么使用 await ,它总是会返回一个 promise对象 。所以在执行async函数的时候,有返回值的情况下可以直接 .then 和 .catch 方法

  • async/await 本质上依然是基于Promise,但在使用上更加简便符合自然习惯。
  • async函数 外部的调用异步执行
  • async函数 内部同步执行 。await之间相当于.then。
  • 需要try/catch await应对promise reject的情况。

返回成功

  1. async function fun() {
  2. return 1
  3. }
  4. fun().then((result) => {
  5. console.log(result); // 1
  6. })

返回错误

函数内部抛出的错误,会被then的第二个函数或catch方法捕获到

  1. async function fun() {
  2. throw 'error'
  3. }
  4. fun().then((result) => {
  5. console.log(result);
  6. }).catch((err) => {
  7. console.log(err); // error
  8. });

await

await 操作是等待一个 promise 对象的结果, promise 返回 resolve 就继续执行,返回 reject 就抛出异常,如果不是 promise 返回该值本身。在此期间会阻塞,延迟执行await下面的语句。只能在 aync 异步函数中使用。

并发

  1. async function(){
  2. //同步阻塞写法
  3. let resultA = await asyncFunA();
  4. let resultB = await asyncFunB();
  5. //异步不阻塞
  6. let asyncA = asyncFunA();//异步非阻塞
  7. let asyncB = asyncFunB();
  8. let resultA = await asyncA; //等到需要的时候再去阻塞
  9. let resultB = await asyncB;
  10. //大量并发
  11. await Promise.all([asyncFunA,asyncFunB]);
  12. //需要拿返回值的话
  13. await Promise.all([asyncFunA,asyncFunB]).then(([resultA ,resultB])=>{});
  14. }

执行顺序

20200503_121853 00_00_00-00_00_30.gif