Cover Image for [TypeScript] Promise は何回 await しても同じ結果を返す

[TypeScript] Promise は何回 await しても同じ結果を返す

この記事は最終更新日から4年以上が経過しています。

TL;DR

  • Promise は await した時に動き始めるわけではない
  • Promise を返すメソッドを実行した時点で処理が始まる
  • Promise は何回 await しても同じ結果を返す

code

const asyncFunc1 = async () => {
  console.log('  |----> asyncFunc1:start')
  await new Promise(resolve => setTimeout(resolve, 1000))
  console.log('           `-> asyncFunc1:end')
  return Promise.resolve('async1')
}
const asyncFunc2 = async () => {
  console.log('  |----> asyncFunc2:start')
  await new Promise(resolve => setTimeout(resolve, 2000))
  console.log('           `-> asyncFunc2:end')
  return Promise.resolve('async2')
}

const syncFunc = () => {
  console.log('  |----> syncFunc:start')
  console.log('          `-> syncFunc:end')
  return Promise.resolve('sync')
}

const main = async () => {
  console.log('main:start')

  console.log('promises:start')
  const promises = [asyncFunc1(), asyncFunc2(), syncFunc()]
  console.log('promises:end')

  console.log('result1:start')
  const result1 = await Promise.all(promises)
  console.log('result1:end:' + result1)

  console.log('result2:start')
  const result2 = await Promise.all(promises)
  console.log('result2:end:' + result2)

  console.log('main:end')
}

main()

実行結果

$ npx ts-node ./promise_sample.ts  
main:start  
promises:start  
|----> asyncFunc1:start  
|----> asyncFunc2:start  
|----> syncFunc:start  
`-> syncFunc:end  
promises:end  
result1:start  
`-> asyncFunc1:end  
`-> asyncFunc2:end  
result1:end:async1,async2,sync  
result2:start  
result2:end:async1,async2,sync  
main:end022

雑感

Promise は await した時に動き始めると思っていたので、並列処理の効率あげるの結構大変なのではと思っていたが調べてみたら勘違いだった。ちゃんと公式ドキュメント読んでから始めればよかった。