参考: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