如果你自认熟悉 async...await,来猜一下这个代码的运行结果

2021-07-13 14:02:49 +08:00
 autoxbc

姐妹篇
如果你自认熟悉 Promise,来猜一下这个代码的运行结果

要用猜的,别偷偷用浏览器运行

const Err = async () => {
	throw new Error(42);
};

const Obj = {
	async A (){
		try {
			return Err();
		} catch {
			console.log('A');
		}
	},
	async B (){
		try {
			await Err();
		} catch {
			console.log('B');
		}
	},
	async C (){
		try {
			Err();
		} catch {
			console.log('C');
		}
	},
};

( async () => {
	for( const key in Obj )
	{
		try {
			await Obj[key]();
		} catch {
			console.log('D');
		}
	}
} )();
5979 次点击
所在节点    JavaScript
35 条回复
meeop
2021-07-13 14:06:54 +08:00
既然还要猜,说明代码不清晰,可读性差,重写吧
binux
2021-07-13 14:09:36 +08:00
DBD
Zeffon
2021-07-13 14:12:58 +08:00
DB 吧
mxT52CRuqR6o5
2021-07-13 14:15:23 +08:00
想了一遍是 DB,运行一遍确实是 DB,不难啊
binux
2021-07-13 14:16:53 +08:00
@mxT52CRuqR6o5 哦,B 没 rethrow,大意了
mxT52CRuqR6o5
2021-07-13 14:18:43 +08:00
这个异常处理弄明白就行了,那个姐妹篇弄不明白也没关系
ayase252
2021-07-13 14:20:58 +08:00
D
B
unhandled promise rejection
Jirajine
2021-07-13 14:25:43 +08:00
这就是为什么使用异常进行错误处理很糟糕,会把控制流搞得混乱。
如果所有错误都用 Promise<value|error>的形式返回,一眼就能看出来。
ericgui
2021-07-13 14:26:35 +08:00
这算是茴字的几种写法嘛
xiangyuecn
2021-07-13 15:08:03 +08:00
感觉:for in object 是一个玄学,应该不是有序的,大部分时候测试不出问题

就像 HashMap 一样,大部分测试的时候是按 put 的顺序,就是不给你看到问题的机会
ochatokori
2021-07-13 15:40:02 +08:00
什么嘛,原来我对 promise 还挺熟悉的
learningman
2021-07-13 15:45:07 +08:00
@Jirajine #8 等下就有人骂你 if err!=nil
mcfog
2021-07-13 16:54:06 +08:00
做这种人肉 v8 题做不出来也无所谓
如果给结果要求解释讲不清楚就不行了
但基本上很多人是能够讲个大概的,没什么区分度

所以我不太喜欢面试被问到这类,也不会自己在面试中问这类问题
RockShake
2021-07-13 16:58:11 +08:00
怎么感觉输出是在骂人
Huelse
2021-07-13 17:07:35 +08:00
作为前端新手经验:await 才“执行”
libook
2021-07-13 17:08:55 +08:00
这个掌握两个原理就行:
1. async 函数返回 Promise ;
2. Promise 只有被取值才能捕捉到错误,所以要么 Promise.prototype.catch(),要么就用 await+try/catch 。

A 部分 Err()返回的是个 Promise,所以 try 不做不到错误,return 出去之后在主函数里 await,就取到了这个错误,被主函数的 try 捕捉到,输出 D 。

B 部分 Err()返回 Promise,被 await 取到错误,被 B 的 try 捕捉到,输出 B 。

C 部分 Err()返回 Promise,C 的 try 捕捉不到错误,因为 C()返回的是一个 undefined,所以主函数的 try 也捕捉不到这个错误,于是这一次循环什么都没输出。
但是可能 JS 引擎会提示有一个 Uncaught 的异常,这个得看 JS 引擎的策略,有的引擎不提示,提示的话如果还输出 message 的话就会输出 42 。
GiantHard
2021-07-13 18:22:19 +08:00
如果你自认熟悉 js 类型转换,来猜一下这个代码的运行结果

```
[!+[]+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]
```

要用猜的,别偷偷用浏览器运行
MichealXie
2021-07-13 18:36:35 +08:00
上次去面试遇到这种猜输出结果的, 心里暗暗在骂, 我自己面试别人重来不出这种题
togou
2021-07-13 18:38:11 +08:00
写的太恶心了 直接 for await of [a(),b(),c()] 嘛
mxT52CRuqR6o5
2021-07-13 18:48:21 +08:00
@xiangyuecn 新版 es 标准规定了 for in 遍历的顺序,是固定的,旧版 chrome 里 for in 的顺序和你具体的代码有关

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789253

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX