你说为什么有了 Promise 和 then,为什么还要使用 async?

本文探讨了在JavaScript中Promise和async/await的互补作用,尽管有了Promise和then,async/await提供了更直观的同步编程体验,增强代码可读性和处理单个Promise的能力,适合避免深度嵌套。

最近代码写着写着,我突然意识到一个问题——我们既然已经有了 Promise 和 then,为啥还需要 async 和 await?

这不是脱裤子放屁吗?

比如说我们需要一段请求服务器的代码:

new Promise((resolve, reject) => {
  setTimeout(() => {
    const res = '明月几时有'
    if (1 > 2) {
      resolve(res)
    } else {
      reject('我不知道,把酒问青天吧')
    }
  }, 1500)
}).then(
  (res) => {
    console.log(`成功啦!结果是${res}`)
  },
  (err) => {
    console.log(`失败了。。。错误是${err}`)
  }
)

如果看不懂,可以看我之前写的一篇,什么叫做 Promise?

这段代码,简洁漂亮,但是如果用上了 async 和 await,就需要写成下面这样:

function ask() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const res = '明月几时有'
      if (1 > 2) {
        resolve(res)
      } else {
        reject('我不知道,把酒问青天吧')
      }
    }, 1500)
  })
}

async function test() {
  try {
    const res = await ask()
  } catch (err) {
    console.log(err)
  }
}

test()

竟然还需要一个 try catch 来捕捉错误!越写越像 Java 呀。

MDN 给我们了一些解释:

如果你在代码中使用了异步函数,就会发现它的语法和结构会更像是标准的同步函数。

说白了,这种写法的一部分原因,就是为了“讨好” Java 和其他的一些程序员。

另一方面呢,也是增强可读性,虽然说 async await 的写法比较丑,但是毫无疑问,可读性远远高于 Promise then。

最为重要的呢,是 Promise 可以无限嵌套,而 async await 只能处理一个 Promise,无法继续嵌套。

所以一旦需要使用多次连续回调,async await 就乏力了。

其实也可以,通过 await 一个Promise.all()来实现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值