ES5をES6で書き換える講座
設問
下記コードをアロー関数、async await, Promise、テンプレートリテラルを使って同期的関数になおして
function delayConsole(ms) {
setTimeout(function () {
console.log(String(ms) + 'ms待ちました');
}, ms);
}
答え
テンプレートリテラル
バッククオート(~
)内で変数を使える。
// 問
console.log(String(ms) + 'ms待ちました');
// 答
console.log(`${ms}ms待ちました`);
アロー関数
- アロー関数は、コールバックor無名関数の拡張。
- 引数が一つなら
()
を省略- ただし、中身なし or 複数は省略不可
- 中身が1行なら、
{}
とreturn
を省略できる- オブジェクトを返す時は、
()
で囲む
- オブジェクトを返す時は、
// 問
function delayConsole(ms) {
・・・
}
// 答
const delayConsole = ms => {
・・・
}
Promise
Promiseは、ある特定の処理が終わったら、引数に渡した関数の処理を実行することができる。
Promiseには、未解決
、解決済み
、拒否
の3つの状態がある。
Promiseオブジェクトは、resolve
とreject
を引数とする関数を引数とする。resolve
は、解決済みの際にreturnで返す。reject
は、拒否した際にreturnで返す。resolve
で解決後は .then()
で次の処理。reject
で拒否した場合は.catch()
で次の処理。
さらに.then()
で繋げると、全ての場合で実行可能。
// 問
setTimeout(function () {
console.log(String(ms) + 'ms待ちました');
}, ms);
// 答
new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, ms);
}).then(() => {
console.log(`${ms}ms待ちました`);
});
async / await
Promiseを利用した構文よりも、簡潔に非同期処理が書ける。
async
は非同期関数を定義する関数宣言- async functionは呼び出されるとPromiseを返す。
- async functionが値をreturnした場合、Promiseは戻り値をresolveする。
await
は Promiseの結果が返されるまで待機する演算子
参考記事
// 問
function delayConsole(ms) {
setTimeout(function () {
console.log(String(ms) + 'ms待ちました');
}, ms);
}
// 答
const delayConsole2 = async ms => {
await new Promise(resolve => setTimeout(resolve, ms))
console.log(`${ms}ms待ちました`);
}