LoginSignup
26
21

More than 5 years have passed since last update.

Javascript Promiseとasync/await

Last updated at Posted at 2017-09-22

Promiseとasync/await

Promiseとは

  • 非同期処理を統一的に扱う方法を定義したオブジェクト。
  • Promiseを使えばネストが深いコールバック嵐から解放される。

async/awaitとは

  • ES2016+から導入されたasync関数と、await演算子。
  • await/asyncを使うにはPromiseから習得する必要がある。
  • await演算子はPromiseの処理が完了するのを待機するために使うもので、async関数(async function)内でのみ有効となる。

Promiseとasync/awaitの違い

  • Promiseは、非同期の処理を上手く同期的に見せたり、並列処理が出来るメソッド。await/asyncは非同期処理を同期的に行うため直列の処理をするもの。書き方が違う。
  • Promiseを使うと、「非同期の処理」、「結果の処理」といったように処理を分けて書くことができるが、.then()メソッドの連鎖の部分は、処理が多くなると複雑になっていく。Promiseをよりシンプルに書けるようにするために、追加されることになったのが「async/await」。

async/awaitの使い方

  • awaitでPromiseの完了を待つことが出来る。そのため、awaitの後続処理を同期的に処理を記述できる。またawaitはasync functionからだけ呼ぶことが出来る。
// Promiseを作成
function testFunc(num, cb) {
    return new Promise((resolve, reject) => {
        return cb(resolve, reject, num);
    });
}

// 非同期処理
function target(resolve, reject, num) {
    return setTimeout(() => {
        try {
            if (num) {
                return resolve(num + num);
            }
            return reject('error!!!!!!');
        } catch(err) {
            return reject(err);
        }
    }, 100);
}

// 非同期処理の結果を用いた処理(async/await)
async function testAsync() {
    try {
        const a1 = await testFunc(1, target); // => 1 + 1
        const a2 = await testFunc(a1, target); // => 2 + 2
        const a3 = await testFunc(a2, target); // => 4 + 4
        return console.log(a3); // => 8
    } catch(err) {
        return console.error(`error: ${err}`);
    }
}

// async関数の実行
testAsync().catch(
    err => console.error(`error: ${err}`)
); // => 8

26
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21