在javascript.info中,await
"暂停函数的执行,直到promise结束,然后使用promise结果继续执行"。如果是这样的话,为什么有时在一个函数中需要多个await
关键字呢?
考虑下面的例子:
async function fetchdata() {
const response = await fetch("https://jsonplaceholder.typicode.com/users/")
const data = await response.json()
console.log(data)
}
fetchdata()
返回从给定URL检索到的对象数组。但是如果await
真的挂起了fetchdata
的执行,如果我删除第二个await
关键字,我希望得到相同的返回值,因为结果const data = response.json()
应该只在response
解决后才运行。
然而,当我运行下面的代码时,fetchdata()
返回一个未决的承诺,即response.json()
在response
实际解决之前运行。
async function fetchdata() {
const response = await fetch("https://jsonplaceholder.typicode.com/users/")
const data = response.json()
console.log(data)
}
fetchdata()
有人能解释一下我对await
关键字的误解吗?
您需要多个await
语句,因为您有多个承诺。
json()
方法返回一个promise(当整个请求体被读取和解析时,它将进行解析)。
这是因为fetch()
返回的承诺解析了头列表何时可用。这使您可以决定下一步要做什么,而无需等待整个主体通过网络传输。
它还允许您使用body
属性将body作为流处理,因此您可以在它传入时一块一块地处理非常大的响应,而不是将整个原始响应存储在内存中。
json()
函数本身需要等待,因为它返回一个Promise