Promiseでの非同期処理
2019/02/18
Promise
JavaScriptはコードをその場で止めておくことができないため、例えばデータを取得してから処理を実行したいときもデータの取得が完了する前に次のコードが実行されてしまいます。
そこでPromiseを使います。
Promiseを使うことで処理の完了を待ってから実行することができます。
promiseの構文
const promise = new Promise((resolve,reject)=>{
});
Promiseには状態があり、以下の3つのようになります
- unresolved 処理待ち
- resolved 処理成功
- rejected 処理失敗
処理が成功した場合はresolveが呼ばれてresolved状態になります
失敗した場合はrejectが呼ばれてrejected状態になります
resolve状態になったときthenが呼ばれます
rejected状態になったときcatchが呼ばれます
resolve→resolved→then
reject→rejected→catch
const promise = new Promise((resolve, reject) => {
resolve();
});
promise.then(()=>{
console.log('処理完了')
});
結果
resolveした場合thenが呼ばれるので処理完了と表示
処理完了
またresolveしたときthenは全て実行されます
promise
.then(()=>{
console.log('処理完了')
})
.then(()=> {
console.log('ここも実行')
});
結果
処理完了ここも実行
省略してシンプルに書く
promise
.then(()=> console.log('処理完了'))
.then(()=> console.log('ここも実行'));
rejectした時はcatchが呼ばれるので処理失敗と表示されます
const promise = new Promise((resolve, reject) => {
reject();
});
promise
.then(()=> console.log('処理完了'))
//ここが呼ばれる .
catch(()=> console.log('処理失敗'));
結果
処理失敗
時間がかかる処理でpromiseしてみます
最初は何も表示されず3秒後にresolveが呼ばれconsole表示されます
rejectの場合も同様です
const promise = new Promise((resolve, reject) => {
//時間かかる処理
setTimeout(()=> {
resolve();
},3000)
});
promise
.then(()=> console.log('処理完了'))
.catch(()=> console.log('処理失敗'));
結果(3秒後に表示される)
処理完了
axiosでAPIリクエスト
APIリクエストしてみる
axios
.get('https://jsonplaceholder.typicode.com/posts/')
.then(response => console.log(response.data))
.catch(() => console.log('失敗'));
データの取得が終わってからconsole.logが実行されるため、consoleにAPIのデータが表示されます