👻

async 関数で await 使わず Promise を返すメモ

に公開
2

async で処理したいが, 遅延処理で処理終わってからなんかしたいなどで await で同期を取りたくない, 使えないときもある.

基本構成(Promise object返す)

async fun() {
    return new Promise(...);
}

if else とかで分岐していて return しわすれすると処理されないので注意. e.g.

async fun() {
   if (...) {
        return new Promise(...);
    } else {
         // Promise オブジェクトが返されない.
        // なんか処理が宙ぶらりんになりそ?
    }
}

とりあえずの策としては最後の行に Promise.reject を書いておくことであろうか...

使う.

使う側は then と catch を呼ぶ. こんな感じ.


なんかしょり...

fun().then((ret) => {
  ...
  }).catch((err) => {
  ...
  });

なんか処理続き...

ここで fun() の呼び出しは(基本)即時に終わり, メインスレッド(?)はなんか処理の続きに進む.
なにかしら処理が完了したら then() のコールバック関数が呼ばれる.エラーが出たら catch の callback が実行される.

例えばテクスチャなしでとりあえずマテリアルを作っておき, テクスチャ読み込みが完了したらマテリアルにテクスチャ貼り付け, みたいな
(3D 地図とかでとりあえず地形を先に描画し, テクスチャはあとで張り付けるなど)

すでに処理し終わっているので成功(resolve)を返す

Promise を返す関数の場合, 成功を明示的に返したい, エラーを明示的に返したい時がある. その場合は対応する Promise の static(?) 関数を返す(Promise chain と言うっぽい?)

成功を返したい場合 Promise.resolve オブジェクトを返すようにする

async fun() {
    return new Promise.resolve(...);
}

エラーを返す

Promise.reject オブジェクトを返す.

async fun() {
    return new Promise.reject(new Error("..."));

}

例外の補足

try - catch で囲わないとエラー時例外が補足されない.

async fun() {
  try {

  } catch (err) {
     return new Promise.reject(new Error("err at fun,", { cause: err}));
  }
}

こんな感じで, catch で補足して reject を返す.
cause を使ってエラーの発生場所をトラッキングできるようにして.
(コメントでご指摘いただきました. ありがとうございます!)

おまけ

static 関数の場合は async static だとエラー.
static async にする.

class MyClas ...
  async statc fun () // NG
  static async fun () // OK

async static のほうが自然そうな気もするけど, why なぜに?

さらなる高みへ

より詳しいことはチャットじーぴーてぃくんなり Claude くんに聞いて.

Discussion

syoyosyoyo

‼️ありがとうございます!