当サイトは、アフィリエイト広告を利用しています
今さらだが、javascriptのPromiseについてまとめる。
Promiseとセットで覚えたほうがいい「async~await」については下記記事でまとめている
Promiseとは
のことで、非同期処理の完了(成功/失敗)を「将来」知るためのオブジェクトであり、
非同期処理を安全にラップして、あとから処理をつなげられるようにしてくれる仕組み。
最近では非同期通信はaxiosやfechAPIを使うことが多いが
axiosもfechAPIも戻り値がPromiseでかえって来る。
言葉だけだとわかりづらいので実装しながらまとめる
const promise = new Promise((resolve, reject) => {setTimeout(() => {resolve("非同期完了!");}, 1000);});
Promiseオブジェクトを生成する
詳しく解説する
Promiseオブジェクト生成時、引数として関数を渡す。この関数を「executor関数」という
上記の例でいえば
(resolve, reject) => {setTimeout(() => {resolve("非同期完了!");}, 1000);}
がexecutor関数
executor関数はコールバック関数。
「コールバック関数」とは、他の関数に引数として渡され、後で呼ばれる関数のこと。
executor関数には引数として
を設定する。
そして何等かの非同期処理をexecutor関数でラップする。
その非同期処理が成功時にはresolveで返却、失敗時にはrejectを使って返却する
(resolve, reject) => {setTimeout(() => {resolve("非同期完了!");}, 1000);}
executor関数内で非同期処理(setTimeout)を実行し、
その結果をresolveで返却している
実際にPromiseを返す関数を作って動きを見てみる
executor関数ではsettimeout関数を使う。
※本来は非同期処理になることが多い。
const promiseFunc = (val) =>new Promise((resolve, reject) => {setTimeout(() => (val >= 100 ? resolve("OK") : reject("NG")), 500);});console.log("処理start");// 成功パターンconsole.log("非同期1start");promiseFunc(200).then((message) => `成功:${message}`).then((editMessage) => console.log(editMessage)).catch((err) => console.log(err)).finally(() => console.log("非同期1End"));// 失敗パターンconsole.log("非同期2start");promiseFunc(20).then((message) => console.log(message)).catch((err) => console.log(`失敗:${err}`)).finally(() => console.log("非同期2End"));console.log("処理end");
詳しく解説していく
const promiseFunc = (val) =>new Promise((resolve, reject) => {setTimeout(() => (val >= 100 ? resolve("OK") : reject("NG")), 500);});
promiseFunc(200).then((message) => `成功:${message}`).then((editMessage) => console.log(editMessage)).catch((err) => console.log(err)).finally(() => console.log("非同期1End"));
promiseFunc(20).then((message) => console.log(message)).catch((err) => console.log(`失敗:${err}`)).finally(() => console.log("非同期2End"));
処理start非同期1start非同期2start処理end成功:OK非同期1End失敗:NG非同期2End
非同期処理のためPromiseのthenやcatchが実行されるのはPromiseが解決されてからになるため
startやendが先に実行されている。
※Promiseに渡したコールバック関数がresovleやrejectをすることをPromiseが解決されるという
Promiseに渡すexecutor関数内でtry~catchを書く。
try内でエラーが発生した場合rejectされる。
そのため呼出し側ではcatchで処理を書く
// エラープロミス関数const errorPromise = () => {return new Promise((resolve, reject) => {try {//エラー発生させるthrow new Error("Some error occured");} catch (err) {//エラーが発生してるのでrejectが返却されるreject(err);}});};const asyncPromiseFunc = () => {//errorPromise関数を実行return errorPromise().then(value => value)//エラーハンドリング.catch(err => console.log(err))}asyncPromiseFunc() //結果 Some error occured
javascritの非同期処理で使われるPromiseについてまとめてみた。
非同期処理においてはPromiseオブジェクトを理解していないと
意味がわからないことも多いので忘備録として残しておく