SlideShare a Scribd company logo
1 of 33
モダン JavaScript における
非同期処理
- Promise, async/await -
12/7/2017
Kazunori Hassy Hashikuchi
「非同期処理」って
なんだ?
非同期処理とは
• プログラム全体の流れを止めずに、時間のかかる処
理を実行させる仕組み
• 例:ファイルの読み込み、外部APIの実行、ネット
ワーク通信
• Amazon での画像読み込みとか
今日のテーマ
• 前近代的な実装 ( コールバック )
• Promise によるコールバックの問題解決
• async/await による Promise の問題解決
前近代的な実装
コールバック関数
var req = new XMLHttpRequest();
req.open('GET', 'http://www.some.url', true);
req.onload = function () {
if (req.status === 200) {
onSuccess(req.responseText); // 通信が終わったら何かやる
} else {
onError();
}
};
req.onerror = function () {
onError();
};
req.send();
});
なにか問題でも?
var req = new XMLHttpRequest();
req.open('GET', 'http://www.some.url', true);
req.onload = function () {
if (req.status === 200) {
var secondReq = new XMLHttpRequest(); // 新たな通信
secondReq.open('GET', ‘http://www.another.url?param='
+ req.responseText, true);
secondReq.onload = function() {
var thirdReq = new XMLHttpRequest(); // 新たな通信
thirdReq.open('GET', ‘http://www.onemore.url?param='
+ secondReq.responseText , true);
thirdReq.onload = function() {
……………….
}
}
} else {
onError();
}
};
ネスト地獄
そこで Promise ですよ
Promise とは
• 従来のコールバックよりも非同期処理を簡潔に記述
できる仕組み
• 「この処理が終わったら次の処理に行く」というパ
ターンに強い
書いてみよう!
Promise を返す関数を作る
function getURL(URL) {
return new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', URL, true);
req.onload = function () {
if (req.status === 200) {
resolve(req.responseText);
} else {
reject(new Error(req.statusText));
}
};
req.onerror = function () {
reject(new Error(req.statusText));
};
req.send();
});
}
// すべて Promise を返す関数
var firstReq = function() {
return getURL('http://www.some.url');
}
var secondReq = function(param) {
return getURL(‘http://www.another.url?' + param);
}
var thirdReq = function(param) {
return getURL('http://www.onemore.url' + param);
}
// firstReq が終わったら secondReq を呼ぶ
// secondReq が終わったら firstReq を呼ぶ
firstReq().then(secondReq) // firstReq の値を受け取る
.then(thirdReq) // secondReq の値を受け取る
.catch(function(error){
console.log(error);
});
ネストがなくなった!
ではもうちょい詳しく
Promiseオブジェクトの作り方
• new Promise(function(resolve, reject){…});
• function は何らかの非同期処理
• 引数の resolve と reject は関数
• 正常時には resolve、例外時には reject を呼ぶ
Promise の状態
• Pending: 処理が完了していない状態(オブジェク
ト生成直後など)
• Fulfilled: 処理が成功(resolve)した状態
• Rejected: 処理が失敗(reject)した状態
Promise チェーン
firstReq().then(secondReq)
.then(thirdReq)
.catch(function(error){
console.log(error);
});
直前の Promise が Fulfilled になったら実行
どこかで Rejected になったら実行
then と catch で
つなげるだけ!
all と race
// すべての Promise が Fulfilled になったら then を実行する
Promise.all([aReq, bReq, cReq]).then(function(values) {
console.log(values); // すべての非同期処理の返り値の配列
}).catch(function() {
// どれかが Rejected になったら実行
})
// いずれかの Promise が Fulfilled か Rejected になったら処理を進める
Promise.race([aReq, bReq, cReq]).then(function(value) {
console.log(value); // 最初に Fulfilled になった非同期処理の返り値
}).catch(function() {
// 最初に Rejected になったら実行
})
めでたしめでたし!
……ほんとに?
非同期処理を
繰り返したい場合
// firstReq を 100回繰り返したいだけ
firstReq().then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
.then(firstReq)
………..// ひたすら繰り返す
.catch(function(error){console.log(error;)});
then地獄
then 地獄の原因と対策
• 非同期処理が完了した次の処理を、then の中、ま
たは Promise チェーンにつなげて書かなければな
らない
• 「非同期処理が終わるまで待つ」ことが書ければ、
独立した処理として for文で解決するのでは……?
そこで
async/await ですよ
async / await とは
• async: function につくキーワード。async function
は Promise を返す
• await: async function の中で使えるキーワード。
Promise が解決されるまで処理の実行を待機する
非同期処理のループ
async function firstReq() {
// Promise が Fulfilled か Rejected になるまで待つ = then/catch と同じ
var result = await getURL('http://www.some.url');
return result; // 実際には result で resolve された Promise が返る
}
// ふつうのループ
(async function() {
for(var i=0; i<100; i++) {
console.log(‘value is ’ + firstReq());
}
})().then(() => {
console.log('すべて成功!');
}).catch(() => {
console.log(‘どっかで失敗……’)
});
まとめ
• Promise オブジェクトには resolve と reject の関数を設定す
る
• 連続する非同期処理は、Promiseチェーン(then, catch) で簡
潔に記述できる
• 複数の非同期処理を同時に実行したい場合は、Promise.all ま
たは Promise.race を使う
• 非同期処理をループさせたい場合は async / await と併用する
としあわせ
参考文献
• JavaScript Promiseの本
https://azu.github.io/promises-book/
• JavaScriptは如何にしてAsync/Awaitを獲得したの
か Qiita版
http://qiita.com/gaogao_9/items/5417d01b46413579
00c7
おわり

More Related Content

What's hot

React入門-JSONを取得して表示する
React入門-JSONを取得して表示するReact入門-JSONを取得して表示する
React入門-JSONを取得して表示するregret raym
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析Yoshitaka Kawashima
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 

What's hot (6)

Starting java fx
Starting java fxStarting java fx
Starting java fx
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
React入門-JSONを取得して表示する
React入門-JSONを取得して表示するReact入門-JSONを取得して表示する
React入門-JSONを取得して表示する
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析
 
REACT & WEB API
REACT & WEB APIREACT & WEB API
REACT & WEB API
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 

Similar to モダン JavaScript における非同期処理 - Promise, async/await -

React+redux+saga 03
React+redux+saga 03React+redux+saga 03
React+redux+saga 03TIS Inc
 
Flow.js
Flow.jsFlow.js
Flow.jsuupaa
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancementkamiyam .
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数Altech Takeno
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218Yoshi Sakai
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門Ishibashi Ryosuke
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にYoshifumi Kawai
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programmingmaruyama097
 
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたAlfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたTasuku Otani
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編Hisakuni Fujimoto
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 

Similar to モダン JavaScript における非同期処理 - Promise, async/await - (20)

React+redux+saga 03
React+redux+saga 03React+redux+saga 03
React+redux+saga 03
 
Flow.js
Flow.jsFlow.js
Flow.js
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
 
Lt 111217
Lt 111217Lt 111217
Lt 111217
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数RubyとJavaScriptに見る第一級関数
RubyとJavaScriptに見る第一級関数
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218
 
jenkinsで遊ぶ
jenkinsで遊ぶjenkinsで遊ぶ
jenkinsで遊ぶ
 
歌舞伎座Tech Rx会
歌舞伎座Tech Rx会歌舞伎座Tech Rx会
歌舞伎座Tech Rx会
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門
 
Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
20120721_ishkawa
20120721_ishkawa20120721_ishkawa
20120721_ishkawa
 
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみたAlfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
Introduction pp.js
Introduction pp.jsIntroduction pp.js
Introduction pp.js
 
20080524
2008052420080524
20080524
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 

Recently uploaded

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (8)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

モダン JavaScript における非同期処理 - Promise, async/await -