有了 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 分 ...
随机推荐
- 学习ELK日志平台(五)
ELK Stack 通常情况下: 1,开发人员是不能登录线上服务器查看日志信息 2,各个系统的日志繁多,日志数据分散难以查找 3,日志数据量较大,查询速度慢,数据不够实时性 4,一个调用会涉及到多个系 ...
- CEPH-3:cephfs功能详解
ceph集群cephfs使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍文件系统cephfs功能如何灵活的使用,集群背景: [cephadmin@yq01-aip- ...
- ros工作空间中文件夹结构
ROS 编译系统 catkin 详解 ros系统学习之Catkin编译系统 ROS--catkin编译系统.package.xml和CMakeList.txt文件 1.build:编译空间 存放CMa ...
- poj_2386_dfs
描述 由于最近的一场雨,农夫john的田地里很多地方流入了水,由一个N*M的矩形表示.每个方格要么有水(W)要么是干的(.).农夫想要知道他的田地里形成了多少池塘. 一个池塘由有水的方块相连,每个方块 ...
- 2022首场MASA技术团队黑客松赛事大赛完美落幕!精彩集锦
Masa技术团队在2021年创立,这一年我们团队发布了我们第一个产品,Masa Blazor.登上了.NET Conf China,我们承诺,开源我们的产品,为开源社区增砖加瓦,一路上收获技术社区文章 ...
- Vue.js快速介绍-超级马里奥像素艺术
原文出处:Quick Introduction to Vue.js - Super Mario Pixel Art ::代码我已经归纳在github上:[vue2-pixel-art]::::__查看 ...
- Input框搜索关键字高亮显示
ruleTitle(text, val) { if (!val) return text; const result = text.replace( new RegExp(val, "g&q ...
- vuejs兄弟组件之间的通信
var Event = new Vue();//准备一个空的实例对象 //A组件 var A = { template: ` <div> <span>我是A组件的数据-> ...
- SQL注入之延迟盲注
延迟盲注 你不知道你输入的数据在sql被执行后是否是正确或错误的.你只知道有数据. 利用原理 借助if语句,如果正确就sleep(5),延迟5秒返回数据.通过数据返回的时间大小判断自己的语句是否正确执 ...
- golang调用海康sdk
git地址:https://gitee.com/mimo431/hcnet-sdk_golang 网络不太流畅,先传gitee上 参考链接: https://www.cnblogs.com/dust9 ...