JavaScript の async/await の仕様をずっと誤解していた
Takaya Kobayashi
Feb 8
Updated on Feb 11, 2018
すごい初歩的なことかもしれないのだけれど、年単位ぐらいで誤解したままコードを書いていたので懺悔のためにも書いておく...。
何が違ったかというと、async function の扱いである。async function も function
と同じだとおもっていて、 Promise
を返さないと呼び出し側で await
できないと勘違いしていた。そのため、今までは
const fn = () => new Promise(async (resolve, reject) => {...})
というような感じで Promise
を一旦返すようにしていた。しかし、async function は呼び出すと Promise
を返してくれるのだ。
参照: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
const fn = async () => {}
console.log(fn)
console.log(fn())
Node.js v9.5 で確認した。
[AsyncFunction: fn]
Promise { undefined }
Promise
が返ってくる...。よくよく調べていくと async function の中で return
すると Promise
を resolve
し、 throw
すると Promise
を reject
することになるんだそうな。
const fn = async () => {
return 'yo'
}
const main = async () => {
const res = await fn()
console.log(res)
}
main()
=>
yo
const fn = async () => {
throw new Error('err')
return 'yo'
}
const main = async () => {
try {
const res = await fn()
console.log(res)
} catch (err) {
console.log(err)
}
}
main()
=>
Error: err
まじか...。俺の Promise
とはなんだったんだ.........。とても恥ずかしい.....。
Did you find this post useful? Show some love!
dev.to is where software developers stay in the loop and avoid career stagnation.
Signing up (for free!) is the first step.
Classic DEV Post from May 16
More from @jgs
#react
#recompose
#javascript
#javascript
#react
#storybook
#recompose
#graphql
#javascript
#facebook
#node
#async
#javascript
#promise
#vue
#beginners
#vuex
#javascript
#opensource
#webdev
#javascript
#mapping
#webdev
#javascript
#isomorphic
#esmodules
#javascript
#algorithms
#webdev
#computerscience
#augmentedreality
#javascript
#virtualreality
#webdev
#mvc
#webdev
#javascript
#node