async/await 和 promise 异同和使用(学习记录)
promise解决了回调地域,多个函数嵌套调用
异步函数是 promise 和生成器的组合,基本上,它们是 promise 的更高级别的抽象。 而 async/await 建立在 promise 之上。
为什么在使用 promise 的时候引入 async/await
它们减少了 promises 的样板,且减少了 promise 链的“不破坏链条”的限制。
// 链式调用
const getFirstUserData = () => {
return fetch('/users.json') // 获取用户列表
.then(response => response.json()) // 解析 JSON
.then(users => users[0]) // 选择第一个用户
.then(user => fetch(`/users/${user.name}`)) // 获取用户数据
.then(userResponse => userResponse.json()) // 解析 JSON
}
getFirstUserData()
使用 await/async 提供的相同功能:
const getFirstUserData = async () => {
const response = await fetch('/users.json') // 获取用户列表
const users = await response.json() // 解析 JSON
const user = users[0] // 选择第一个用户
const userResponse = await fetch(`/users/${user.name}`) // 获取用户数据
const userData = await userResponse.json() // 解析 JSON
return userData
}
getFirstUserData()
多个异步函数串联
const promiseToDoSomething = () => {
return new Promise(resolve => {
setTimeout(() => resolve('做些事情'), 10000)
})
}
const watchOverSomeoneDoingSomething = async () => {
const something = await promiseToDoSomething()
return something + ' 查看'
}
const watchOverSomeoneWatchingSomeoneDoingSomething = async () => {
const something = await watchOverSomeoneDoingSomething()
return something + ' 再次查看'
}
watchOverSomeoneWatchingSomeoneDoingSomething().then(res => {
console.log(res)
})
输出: 做些事情 查看 再次查看
调试 promise 很难,因为调试器不会跳过异步的代码。 Async/await 使这非常容易,因为对于编译器而言,它就像同步代码一样
视使用场景而用