FrontPage
コールバック †
setTimeout は関数登録のみを同期的に行うので、catch されない。
function throwError() {
throw new Error("error");
}
try {
setTimeout(throwError, 1000);
} catch (e) {
console.log(e);
}
Promise †
- Promise オブジェクトは、
- 状態 (pending, fulfilled, rejected)
- 伝達変数 res: fulfilled, rejected がどのような状態で終わり次の Promise に何を伝えるべきかを示す変数
- 成功時実行関数 (resolve(res)): fulfilled 状態にして、内部変数 res に引数をコピーする
- 失敗時実行関数 (reject(res)): rejected 状態にして、内部変数 res に引数をコピーする
- then(func_resolve, [func_reject = res => reject(res)]): resolve(res) で終了した時、func_resolve(res) を実行する。func_resolve が通常に return ret; を返した場合、それは Promise.resolve(ret) が次に渡されたことになる。逆に例外を表す場合には return Promise.reject(ret) を返す必要がある。
- もし func_reject がある場合、reject(res) で終了した時、func_reject(res) を実行する。func_reject が通常に return ret; を返した場合、それは Promise.resolve(ret) が次に渡されたことになる。逆に例外を表す場合には return Promise.reject(ret) を返す必要がある。
- ただし、func_reject がない場合は res => reject(res) が入っているとみなされ、then が連鎖していたら最後まで流れる。
- catch(func_reject): reject(res) で終了した時、func_reject(res) を実行する。
- finally(func): 終端処理 func を行う
- Promise.resolve(res)
- fulfilled, 伝達変数 res の Promise オブジェクトを作る。
- Promise.reject(res)
- reject, 伝達変数 res の Promise オブジェクトを作る。
await †
- async 非同期関数は Promise オブジェクトを返します。
- return x; で終わった場合: Promise.resolve(x) が帰ります。
- throw err; で終わった場合: Promise.reject(x) が帰ります(要検証)
- return Promise.resolve(x); で完了した場合、そのまま返します
- return Promise.reject(x); で完了した場合、そのまま返します
- 返り値がPromiseオブジェクト以外のとき,その値でfulfilledとなります。
- await演算子は Promise オブジェクトを受けとりfulfilledとなるまで待機します。非同期関数の内部でのみ使用することができます←超重要
- 例外を握りつぶすかの選択
- message() が rejected で終わっても処理を継続したい場合: await message().catch((err) => {return err;}) のようにする
- message が fulfilled ならば catch が return Promise.resolved(res) に一致するので問題なく終わる
- message が rejected ならば、catch が呼び出され、catch の中での素の return err; は Promise.resolved(err) なので問題なく終わる
- message() が rejected で終わってから処理を中断したい場合: try ~ catchを使う
- try 文の中で await が rejected(err) で終わった場合、catch (err) にプログラムポインタが移動する。
- Promise.all([])は渡された配列の全てのPromiseオブジェクトがfulfilledとなったときにfulfilledとなるPromiseオブジェクトを返す。これにより、集合待ち処理ができるようになる。
- ちなみに or バージョンは Promise.race。race することはするが、別に一番はじめに実行されたやつ以外をキャンセルする機能はない