前回まで
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 = onRejection
、parent._result = reason
としてinvokeCallback
が実行される。
onRejectionでerrorを投げなければ、そのまま実行されて実行結果に対してresolveが呼ばれる。
基本的にはreasonとなるerrorを処理するだけ。
次回
subscribersが実行されるような状況ってどんなとき?