Promise.all 與 Async/Await
假設我有一個 API 調用,它從數據庫中返回所有用戶,並且需要一些時間才能完成。
// First promise returns an array after a delay
const getUsers = () => {
return new Promise((resolve, reject) => {
return setTimeout(
() => resolve([{ id: 'jon' }, { id: 'andrey' }, { id: 'tania' }]),
600
)
})
}
現在有另一個調用依賴於整個用戶數組中存在的一些信息。
// Second promise relies on the result of first promise
const getIdFromUser = (user) => {
return new Promise((resolve, reject) => {
return setTimeout(() => resolve(user.id), 500)
})
}
第三個調用修改了第二個調用。
// Third promise relies on the result of the second promise
const capitalizeIds = (id) => {
return new Promise((resolve, reject) => {
return setTimeout(() => resolve(id.toUpperCase()), 200)
})
}
我可能會嘗試運行第一個電話,然後使用 for...of
循環運行依賴它的後續調用。
const runAsyncFunctions = async () => {
const users = await getUsers()
for (let user of users) {
const userId = await getIdFromUser(user)
console.log(userId)
const capitalizedId = await capitalizeIds(userId)
console.log(capitalizedId)
}
console.log(users)
}
runAsyncFunctions()
但是,這將是我的輸出:
jon
JON
andrey
ANDREY
tania
TANIA
(3) [{…}, {…}, {…}]
我可以使用 Promise.all()
而是先運行所有第一個函數,然後運行所有第二個函數,然後運行所有第三個函數。
const runAsyncFunctions = async () => {
const users = await getUsers()
Promise.all(
users.map(async (user) => {
const userId = await getIdFromUser(user)
console.log(userId)
const capitalizedId = await capitalizeIds(userId)
console.log(capitalizedId)
})
)
console.log(users)
}
(3) [{…}, {…}, {…}]
jon
andrey
tania
JON
ANDREY
TANIA
希望對某人有所幫助。
這是您可以在控制台中運行的整個代碼段。
// First promise returns an array
const getUsers = () => {
return new Promise((resolve, reject) => {
return setTimeout(
() => resolve([{ id: 'jon' }, { id: 'andrey' }, { id: 'tania' }]),
600
)
})
}
// Second promise relies on the resulting array of first promise
const getIdFromUser = (user) => {
return new Promise((resolve, reject) => {
return setTimeout(() => resolve(user.id), 500)
})
}
// Third promise relies on the result of the second promise
const capitalizeIds = (id) => {
return new Promise((resolve, reject) => {
return setTimeout(() => resolve(id.toUpperCase()), 200)
})
}
const runAsyncFunctions = async () => {
const users = await getUsers()
Promise.all(
users.map(async (user) => {
const userId = await getIdFromUser(user)
console.log(userId)
const capitalizedId = await capitalizeIds(userId)
console.log(capitalizedId)
})
)
console.log(users)
}
runAsyncFunctions()
上一篇
了解位、字節和數字基數
下一篇
ES6 語法和功能概述