小七平时在使用ES2017的 async功能经常会有如下:

const bluebird = require('bluebird');async function doSomething() {await bluebird.delay(1000);throw new Error('ttt');
}(async function() {return doSomething();// 关注点
})().then(function() {console.log('ok');}).catch(function(err) {console.error('fail');});

小七在调用doSomething的时候直接使用 `return doSomething()` ,而不是用 `return await doSomething()`。

因为它们的执行和结果都是一样的。在大部分情况下,这种方式是正确的,而且代码也比较简洁。

但事实上在执行的时候是有些差异的,我们看下下面的例子。

(async function() {try {return doSomething();// 关注点,这里我们省略了await 产生了更我们设想不太一样的结果} catch (err) {console.log('do something ignore');}
})().then(function() {console.log('ok');}).catch(function(err) {console.error('fail');});
//输出 :fail

小七这里原本的设想是 在调用doSomething的时候,如果有什么错误的话,忽略错误,正常返回。

但是结果确实抛出了错误,被最后面的catch捕获。输出了fail。

于是调整了下代码:

const bluebird = require('bluebird');async function doSomething() {await bluebird.delay(1000);throw new Error('ttt');
}(async function() {try {return await doSomething();// 关注点,这里恢复了省略掉的 await} catch (err) {console.log('do something ignore');}
})().then(function() {console.log('ok');}).catch(function(err) {console.error('fail');});
//输出 :
//do something ignore
//ok

把 await 恢复回来就正常了。

这里主要的原因就在于小七对async语法糖原理的误解,小七以为在async函数中使用return的时候和return await是一样的,是因为return 隐含了await的功能。然而并非如此,async中的return 只是简单的返回一个promise,所以return 在使用的时候并没有任何抛错,try catch 自然就没法获得该错误。而返回的promise被后面的.catch方法捕获到错误。

而如果使用  return await doSomething() 的时候,等价于 先await了doSomething返回的promise,如果有reject,则会直接传给cacth block 处理。

总结,async函数中的return 并没有黑魔法,在大部分情况下也不需要黑魔法,因为async方法的结果也是一个promise,所以返回一个promise是等价的。

但我们还是要理解它的实现原理。

因为在async 中 try catch 语法糖的原理是处理同步抛出的错误和await产生的reject,所以,我们不能省略掉await的调用。

转载于:https://www.cnblogs.com/chianquan/p/9419089.html

关于async 中return 和 return await 的差异相关推荐

  1. return true Java_[Java教程]js中return,return true,return false的用法及区别

    [Java教程]js中return,return true,return false的用法及区别 0 2015-11-16 23:00:03 1.语法及返回方式 ①返回控制与函数结果 语法为:retu ...

  2. Java中finally和return执行顺序

    思考一个问题 Java异常捕获机制try-catch-finally块中的finally语句是否一定会被执行?起码在以下两种情况下是不会被执行的: 1.在try之前就返回了,try没有执行到. 2.t ...

  3. linux脚本中的exit,Shell中exit和return的区别讲解

    1.exit命令 exit命令是Shell内建命令,用于退出当前Shell进程.使用格式如下: exit [] 可以指定退出状态n,n的取值范围是0-255,一般情况下,0表示正常退出,非零表示异常退 ...

  4. Laravel中构造方法中不能写return!!!

    今天遇到的大坑 在laravel中 __construct 这个方法中不能写return 完全不能返回 而且还会向下执行 具体原因不知道为什么 解决办法!!!! 用中间件来实现就可以了 Over!!! ...

  5. 可惜Java中没有yield return

    项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...

  6. Java中 break continue return 的区别

    1.break break :跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环: for (int i = 0; i < 10; i++) { i ...

  7. java中finally和return的执行顺序

    注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有re ...

  8. java中异常与return

    抽时间整理了下java中异常与return,以前这块总是弄混淆,觉得还是写下来慢慢整理比较好.由于水平有限,仅供参考.废话不多说,直接上代码. 下面是两个方法: 1 public static int ...

  9. js中return、return false 、return true各自代表什么含义

    return语句代表需要返回一个值,如果不需要就不需要使用return语句.都类似一个出口,return 可以结束方法体中 return后面部分代码的执行.return false 或者 return ...

最新文章

  1. 计算机网络管理考试价格,2021年计算机网络管理员考试模拟试题库和答案...doc...
  2. 游戏里的角色都什么格式图片_二十年前是怎样开发游戏的?
  3. 前端生态混乱,AMPMIP在努力做标准化工作
  4. maven生成jar,提示没有“没有主清单属性
  5. Windows下JetBrains CLion的pthread使用配置
  6. ebs开发入门 oracle 知乎_微信小程序云开发入门第一篇---开发准备事项
  7. MTK平台TP驱动框架分析
  8. Java httpClient 发送http请求
  9. c++ windows下读取大文件(内存映射)
  10. lato字体可以商用吗_Google Fonts最受欢迎25款,免版权字体
  11. dependency报错
  12. 06)JDK1.8 新特性学习 重复注解
  13. HTML实现倒计时插件
  14. 云计算与虚拟化的关系是什么?
  15. 转鹤冲天兄反射性能比较
  16. 2021-05-12 MongoDB面试题 MongoDB副本集选举条件有那些
  17. 天猫淘宝登陆页面无限循环 解决办法
  18. 计算机外文翻译旅游网站,在线旅游外文文献翻译最新译文资料
  19. 大数据交易研究_学术著作 | 基于电商平台大数据的特征价格指数研究——统计研究...
  20. 智慧服务型政务平台规划方案(ppt)

热门文章

  1. raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘
  2. Tomcat:基础安装和使用教程
  3. Canvas 学习笔记1
  4. sqlite3 改源代码支持上下键查询历史命令
  5. Android平台上使用属性系统(property system)
  6. android 虚拟按键 增减和删除的方法
  7. dokuwiki mysql_dokuwiki安装和使用总结 (windows安装版本)
  8. 《2021 年中国视频云场景应用洞察白皮书》联合首发!
  9. 郑州商品交易所与阿里云达成合作,推进核心数据分析平台建设
  10. E百科 | 基于MEC的边缘AI服务