有了async为什么还要promise

Posted 火腿肠烧烤大赛冠军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有了async为什么还要promise相关的知识,希望对你有一定的参考价值。

今天突然想到了一个面试问题,有了async为什么还要promise处理异步请求,当时想的答案是,promise是将任务异步处理,而async和await是将异步任务趋于同步任务,但是并不知道其原理,考虑了一下,大概有如下想法。

原代码

// wait() 是一个返回 promise 的函数
async function test1 () 
  console.log(111)
  await wait(500)
  console.log(222)
  await wait(1000)
  console.log(333)

转化为

function test1 () 
  this.prev = 0
  return new Promise(resolve => 
    function loop(value, _next) 
      return Promise.resolve(value).then(_next)
    
    function fn1 () 
      switch (this.prev) 
        case 0:
          console.log(111);
          this.prev = 3;
          return loop(wait(500), fn1);
        case 3:
          console.log(222);
          this.prev = 6;
          return loop(wait(1000), fn1);
        case 6:
          console.log(333);
          return resolve()
      
    
    fn1(resolve)
  )

这是因为promise可以将await外的任务变成微任务 也就是放入异步队列中等待 而await后的内容则是放在promise为同步任务,所以同步任务执行后才会执行异步任务
这样就解释了为什么await可以强制等待代码执行结束后再执行

还有一些疏漏 等想通后再补充

以上是关于有了async为什么还要promise的主要内容,如果未能解决你的问题,请参考以下文章

js async await 终极异步解决方案

js async await 终极异步解决方案

Promise,Async,await简介

如何将 useQuery 放入 Promise

Async/Await替代Promise的6个理由

Async/Await替代Promise的6个理由