为何async函数中需多个await关键字?解析我的理解误区
你对
await的核心误区解析 你的问题核心是混淆了**await处理的第一个Promise和后续异步方法返回的新Promise**,下面一步步拆解:
1. 第一个await fetch()到底做了什么?
fetch()返回的是一个Promise,它的resolved状态代表HTTP响应已经完成(比如拿到了响应头、响应体开始传输),此时await会暂停函数,直到这个Promise完成,你拿到的response是一个Response对象——注意,这个对象只是表示HTTP请求成功了,但响应体的内容还没被解析成JSON。
2. response.json()是同步的吗?
不是!response.json()本身是一个异步方法,调用它会立即返回一个新的Promise。这个Promise的resolved状态,要等到响应体的所有内容被读取、并解析成JSON格式后才会触发。
3. 为什么第二个await不能省?
- 加
await的情况:await response.json()会再次暂停函数,直到这个解析Promise完成,data拿到的是真正的JSON数据,console.log打印的就是目标数组。 - 不加
await的情况:data直接拿到的是response.json()返回的未完成的Promise对象,此时函数会继续执行,console.log打印的自然是Promise { <pending> },而整个fetchdata()函数(因为是async函数)最终返回的也是这个pending状态的Promise。
总结你的误区
你误以为await fetch()完成后,response的所有操作都是同步的,但实际上Response对象的json()、text()等解析方法都是异步的,它们各自返回独立的Promise,必须用await等待这些Promise完成,才能拿到最终的解析结果。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

