edo1z blog

プログラミングなどに関するブログです

Javascript - Promsise async await

参考:Promiseを使う

Promiseの例

const axios = require('axios')
function hoge(msg) {
  return new Promise((resolve, reject) => {
    if(msg === 'hoge') resolve('page')
    reject('error')
  })
}
function page() {
  return new Promise((resolve, reject) => {
    axios.get('https://google.com')
      .then(res => resolve('hoge'))
      .catch(err => reject(err))
  })
}

(function() {
  new Promise(ok => ok(1))
    .then(no => console.log(no))
    .then(() => console.log(2))
})()

page()
  .then(msg => hoge(msg))
  .then(msg => console.log(msg))
  .catch(err => console.log(err))

結果

1
2
page

promiseはこんな感じで、同期的にしてくれます。thenthenとつなげていけます。

asyncとawait

ここに詳しく書いてありました。分かりやすいなー。

asyncを関数の宣言の前に付けると、その関数は必ずPromiseを返します。

awaitは、asyncがついた関数の中でだけ使えて、awaitを使うと、thenの表記を簡略化できて、超普通の同期的関数のように扱える。

async function fn() {
  return 100
}
fn().then(no => console.log(no))

async function hoge () {
  let result = await fn()
  console.log(result)
}
hoge()

実行結果

100
100

sleep関数をつくる

参考サイトにあるsleep関数を作ってみます。

const sleep = (ms, result) => {
  return new Promise(resolve => {
    setTimeout(resolve(result), ms)
  })
}
sleep(5000).then(() => console.log('5 seconds'))
sleep(5000, 200).then(no => console.log(no))

async function hoge () {
    await sleep(5000)
    console.log('after 5sec')
    let result = await sleep(1000, 'hoge!!')
    console.log(result)
}

hoge()

これnodeで実行できないというか、sleepしなかった。まあいいか。

$ node index.js
5 seconds
200
after 5sec
hoge!!
$ node --harmony-async-await index
node: bad option: --harmony-async-await