LoginSignup
0
0

More than 5 years have passed since last update.

Promiseとは4

Posted at

前回まで

resolveの処理を読み終わった。

reject

最初のrejectはresolverの処理がerrorを投げる場合。

function reject(promise, reason) {
  if (promise._state !== PENDING) { return; }
  promise._state = REJECTED;
  promise._result = reason;

  asap(publishRejection, promise);
}

状態と結果が更新されてpublishRejection(promise)が実行される。

function publishRejection(promise) {
  if (promise._onerror) {
    promise._onerror(promise._result);
  }

  publish(promise);
}

ここではpromise._onerror === undefined

function publish(promise) {
  let subscribers = promise._subscribers;
  let settled = promise._state;

  if (subscribers.length === 0) { return; }

  let child, callback, detail = promise._result;

  for (let i = 0; i < subscribers.length; i += 3) {
    child = subscribers[i];
    callback = subscribers[i + settled];

    if (child) {
      invokeCallback(settled, child, callback, detail);
    } else {
      callback(detail);
    }
  }

  promise._subscribers.length = 0;
}

この時点ではsubscribers.length === 0なので特になにもなく終わる・・・
次のrejectはresolveでerrorが起きた場合。
このときもreasonにerror内容が設定されるだけで、なにもなく終わる・・・
rejectされた結果に対して何かをするにはどうすればいいのか?

rejectされた結果を受け取る、まさにcatch

それはcatch

catch

catch(onRejection) {
  return this.then(null, onRejection);
}

reject時のthenは、callback = onRejectionparent._result = reasonとしてinvokeCallbackが実行される。
onRejectionでerrorを投げなければ、そのまま実行されて実行結果に対してresolveが呼ばれる。
基本的にはreasonとなるerrorを処理するだけ。

次回

subscribersが実行されるような状況ってどんなとき?

0
0
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
0
0