iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Javascript】Promise ってなんぞや

最近、個人で開発しているアプリで Node.js を触ることが多いのですが、Javascript で非同期処理を扱う際の知識が不足しているので、この記事をきっかけに少しずつ勉強していこうかと思います👷‍♀️

ということでまずはタイトルの通り Promise について調べていくっ

f:id:yum_fishing:20201222174835p:plain

Promise って?

Promise は、Javascript における非同期処理の結果を表すオブジェクトです。呼び出し側はこの Promise を使用することで非同期処理をより完結に記述することができます(つまりコールバック地獄にならない)。Swift 標準では Promise のようなものは用意されていませんが、RxSwift における Observable だったり、SwiftTask における Task だったりが役割的には近い感じだと思います。

ちなみに、Swift の Async/Await に関する Proposal もあるみたいなので、もしかしたら Swift6 から標準で Promise ライクに非同期処理を書ける時がくるかもしれませんね👀

Concrete proposal for async semantics in Swift · GitHub

Promise の基本

Promise には下記の3つ状態があり、そのうちの下二つ(fulfilledrejected)を引数にとります。

  • pending
  • fulfilled
  • rejected

第一引数には成功時のコールバックを、第二引数には失敗時のコールバックをそれぞれ記述します。

new Promise(function(resolve, reject) {
    resolve('success');
});

new Promise(function(resolve, reject) {
    reject('failure');
});

呼び出し側ではそれぞれの通知を下記のように受け取ることができます。

function test() {
    promise_sample()
        .then((data) => { console.log(data); }, 
        (error) => { console.log(error); }
    );
}

失敗時のコールバックは catch で受け取ることもできます。

function test() {
    promise_sample()
        .then((data) => {
            console.log(data);
        })
        .catch((error) => {
            console.log(error);
        });
}

また、失敗時の処理の後に then をつけることで、成功時と失敗時の処理の後に処理を書くことができるようです。RxSwift における onCompleted() みたいな感じですね🧑‍🔧

function test() {
    promise_sample()
        .then((data) => {
            console.log(data);
        })
        .catch((error) => {
            console.log(error);
        })
        .then(() => {
            console.log('Finish');
        });
}

という感じで本日は以上になります。また、わからないことが出てきたら Javascript 関連で記事を書こうかと思います✍️

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com