有了 Promise 和 then,为什么还要使用 async?
有了 Promise 和 then,为什么还要使用 async?
本文写于 2020 年 5 月 13 日
最近代码写着写着,我突然意识到一个问题——我们既然已经有了 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()来实现。
(完)
有了 Promise 和 then,为什么还要使用 async?的更多相关文章
- Callback Promise Generator Async-Await 和异常处理的演进
根据笔者的项目经验,本文讲解了从函数回调,到 es7 规范的异常处理方式.异常处理的优雅性随着规范的进步越来越高,不要害怕使用 try catch,不能回避异常处理. 我们需要一个健全的架构捕获所有同 ...
- promise async await使用
1.Promise (名字含义:promise为承诺,表示其他手段无法改变) Promise 对象代表一个异步操作,其不受外界影响,有三种状态: Pending(进行中.未完成的) Resolved( ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- 异步Promise及Async/Await最完整入门攻略
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...
- promise 进阶 —— async / await 结合 bluebird
一.背景 1.Node.js 异步控制 在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES ...
- js的promise
转载自: https://segmentfault.com/a/1190000007032448#articleHeader16 一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学 ...
- 异步Promise及Async/Await可能最完整入门攻略
此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...
- 转载 初探Promise
初探Promise https://segmentfault.com/a/1190000007032448 javascript es6 promise 33.5k 次阅读 · 读完需要 65 分 ...
随机推荐
- @Required 注解 ?
这个注解表明 bean 的属性必须在配置的时候设置,通过一个 bean 定义的显式的 属性值或通过自动装配,若@Required 注解的 bean 属性未被设置,容器将抛出 BeanInitializ ...
- jsp:useBean报错The value for the useBean class attribute X is invalid
一.解决方法 1.先检查<jsp:useBean id="dog" class="cn.edu.dgut.el.tools.Dog" scope=&quo ...
- 使用Servlet编写增删改查
第一步创建一个表 1 create database liyongzhendb default character set utf8 collate utf8_bin; 2 3 CREATE TABL ...
- Spring Mvc 源代码之我见 一
spring mvc 是一个web框架,包括controller.model.view 三大块.其中,核心在于model这个模块,用于处理请求的request. 和之前的博客一样,关键的代码,我会标注 ...
- 什么是pandas
- PN结
摘自:https://blog.csdn.net/CPJ_phone/article/details/40979027 ...
- 安装Backstage.io应用
Backstage介绍 What's Backstage? Backstage is an open platform for building developer portals. Powered ...
- 一个用于学习的react项目
React-element 根据开源项目 vue-sell进行的开发,将其改造成了react的项目.在开始学习vue的时候就是用的这个项目,发现效果不错,所以在学习React也使用了此项目. 目的:将 ...
- Spark周总结(一)
本周学习内容: 1.搭建虚拟机Spark环境 2.idea编写Scala脚本并在yarn上运行 总结: 这周是回家第一周,虽然没啥事,但是还是想放松放松,也是万事开头难,跟着教程做,但总有几步跟教程上 ...
- 【uniapp 开发】字典工具类 ObjectUtil
{__/} ( • - •) /つ寿司 你要不要? {__/} ( • - •) /つ草莓 你要不要? {__/} ( • - •) /つ披萨 你要不要? {__/} ( • - •) /つ桃子 你要 ...