javascript - async, await
4023 ワード
asyncとawaitは約束を簡潔かつ同期させる.
async
これを約束に変えると.
async
await
awaitはasync付き関数でのみ使用できます.
pickFruts関数を作成してappleとバナナをインポートするとします.
エラーオカレンス
待機パラレル処理
getApple関数は3秒遅延し、getApple関数は3秒遅延して実行されます.つまり、6秒はシリアル処理なので効率が悪い(何を言っているのかさっぱり分からない!)バナナは謝罪を受けることと関係がないので、待たずに同時に行うことができます!
上の状況は簡潔に書くことができます.
ソース:https://www.youtube.com/watch?v=aoQSOZfz3vQ&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=13
async
function fetchUser(){
// do network request in 10 secs
return "dongha"
}
const user = fetchUser();
ユーザーのデータを受信するfetchUserという関数があり、10秒かかります.userという名前の変数が戻り値を割り当てる場合、同期実行には10秒かかります.(その間、JavaScriptエンジンは他の作業をしません)これを約束に変えると.
function fetchUser(){
// do network request in 10 secs
return new Promise((resolve, reject))
}
const user = fetchUser();
promise 内部ではresolveとrequestは、コールバック関数を受信するコールバック関数を作成することを意味します.function fetchUser(){
// do network request in 10 secs
return new Promise((resolve, reject) =>{
resolve("dongha")
})
}
const user = fetchUser();
user.then(console.log) // dongha
user変数は戻り値を受け入れるのでthenというコールバック関数を使用してコンソールに撮るとdonghaが出力されます.async
async function fetchUser(){
// do network request in 10 secs
return "dongha"
}
const user = fetchUser();
user.then(console.log) // dongha
functionの前にasyncと書いて、約束の効果と同じです!await
awaitはasync付き関数でのみ使用できます.
function delay(ms){
return new Promise(resolve => setTimeout(resolve, ms))
}
async function getApple(){
await delay(3000)
return "apple"
}
async function getBanana(){
await delay(3000)
return "banana"
}
delay関数は、msをパラメータとして受け入れ、msの後にresolveを呼び出すpromiseを返します.3秒が終わるまで待つ.つまり、3秒後には「apple」に戻る「promiss」が発生します.function getBanana(){
return delay(3000)
.then(()=>"banana")
}
getBanna関数をpromiseを使用する関数に変更します.awaitを書くのは動機的で直感的に見えます.pickFruts関数を作成してappleとバナナをインポートするとします.
function pickFruits() {
return getApple()
.then(apple => {
return getBanana()
.then(banana => `${apple} + ${banana}`)
})
}
pickFruits().then(console.log) // apple + banana
約束が重なるとcallback地獄に似ています.asyncの使用async function pickFruits(){
const apple = await getApple()
const banana = await getBanana()
return `${apple} + ${banana}`
}
pickFruits().then(console.log) // apple + banana
asyncを関数の前に貼り付け、awaitを使用するとより簡潔になります.エラーオカレンス
function getBanana(){
return delay(3000)
throw "error"
return "apple"
}
async function pickFruits(){
try {
const apple = await getApple()
const banana = await getBanana()
}
catch() {}
return `${apple} + ${banana}`
}
pickFruits().then(console.log) // apple + banana
tryとcatchはエラーを制御できます!待機パラレル処理
getApple関数は3秒遅延し、getApple関数は3秒遅延して実行されます.つまり、6秒はシリアル処理なので効率が悪い(何を言っているのかさっぱり分からない!)バナナは謝罪を受けることと関係がないので、待たずに同時に行うことができます!
async function pickFruits() {
const applePromise = getApple()
const bananaPromise = getBanana()
const apple = await applePromise
const banana = await bananaPromise
return `${apple} + ${banana}`
}
pickFruits().then(console.log) // apple + banana
ApplePromiseとbanaPromiseは変数を作成しgetApple()を割り当てます.つまり、すぐに約束を果たすということです.その後awaitでapple変数と同期し、2つの関数を並列に実行し、3秒以内に完了します.上の状況は簡潔に書くことができます.
function pickAllFruits() {
return Promise.all([getApple(), getBanana()]).then(fruits => fruits.join(' + '))
}
pickAllFruits().then(console.log) // apple + banana apple + banana
allはapiであり、promise配列を渡すだけで、すべてのpromise受信を並列に待つことができる.function pickOnlyOne(){
return Promise.race([getApple(), getBanana()] )
}
pickOnlyOne().then(console.log) // apple
raceは、配列形式で受け取った約束を伝えています.ソース:https://www.youtube.com/watch?v=aoQSOZfz3vQ&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=13
Reference
この問題について(javascript - async, await), 我々は、より多くの情報をここで見つけました https://velog.io/@dongha1992/javascript-async-awaitテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol