Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
promise
to4iki
May 20, 2015
Programming
0
57
promise
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise
to4iki
May 20, 2015
Tweet
Share
More Decks by to4iki
See All by to4iki
to4iki
0
460
to4iki
1
270
to4iki
11
2.4k
to4iki
0
8.7k
to4iki
2
740
to4iki
0
100
to4iki
0
16
to4iki
0
380
to4iki
0
860
Other Decks in Programming
See All in Programming
line_developers_tw
0
990
ippey
0
170
momofff
0
160
loleg
0
190
komagata
1
1.8k
asumikan
0
280
77web
4
1.4k
mu2in
0
130
manfredsteyer
PRO
0
240
nbkouhou
1
1k
nbkouhou
9
4.5k
yosuke_furukawa
PRO
13
3.6k
Featured
See All Featured
tanoku
86
8.5k
jasonvnalue
82
8k
ddemaree
274
31k
erikaheidi
13
4.2k
lynnandtonic
270
16k
roundedbygravity
84
7.8k
zenorocha
297
39k
brettharned
93
3k
dougneiner
55
5.4k
jonrohan
1021
380k
3n
163
22k
frogandcode
127
20k
Transcript
Promiseͱ͔ 2015—05-18 toshiki takezawa @to4iki
୭ʁ • ᖒढ़ق • 2012/4 • Ruby, Scala, Swift, JavaScript
• ·ͨΛ৳ͦ͏ͱࢥͬͯͨΓ
ԿͬͯΜͷɺͬͯͨʁ • WebαΠτͷJava -> RubyͷϦϓϨΠ • ιγϟήͷAPI࡞ • ిࢠϚϯΨͷϓϥοτϑΥʔϜӡӦ •
ઌ݄iOSΞϓϦΛϦϦʔε͠·ͨ͠
What is Promise?
Promise ͱݺΕΔͷ͕͋ΔΒ͍͠ݴޠ • ECMAScript 6 (Promises A/+) • jQuery.Deferred •
Java (java.util.concurrent.Future) • Scala (scala.concurrent.Future)
Promise<T> • ඇಉظॲཧΛநԽͨ͠ΦϒδΣΫτͱͦΕ Λૢ࡞͢ΔΈ • কདྷతʹ "ਖ਼ৗͳ" or "ҟৗͳ" ͕ೖΔࣄΛ༧ͨ͠ΦϒδΣΫτ
• ex. APIͷϦΫΤετ͕ฦ͖ͬͯͨΒ… • ͍ΘΏΔσβΠϯύλʔϯͷͻͱͭ
ඇಉظ?
ྫ. Α͋͘Δඇಉظॲཧ (JavaScriptͰ)
callback pattern getA(function(error, a) { // Aऔಘࣦഊ࣌ͷॲཧ if (error) {
throw error; } getB(function(error, b) { // Bऔಘࣦഊ࣌ͷॲཧ if (error) { throw error; } getC(function(error, c) { // Cऔಘࣦഊ࣌ͷॲཧ if (error) { throw error; } // a, b, cऔಘޭ࣌ͷॲཧ done(); }); }); });
None
promise pattern getA() .then(getB()) .then(getC()) .then(done()) .catch(function(e) { throw e;
})
Example.
ex. getURL 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ίϯετϥΫλ͔ΒPromiseΦϒδΣΫτ(Πϯελϯε)Λ࡞Γฦ͢ • ίϯετϥΫλͷதͰ(ඇಉظ)ॲཧΛߦ͏ • ॲཧͷ൱ʹΑͬͯɺresolve<݁Ռͷ> ·ͨ reject<ErrorΦϒδΣΫτ> ΛݺͿ
PromiseΦϒδΣΫτ var URL = "http://httpbin.org/get"; getURL(URL).then(function onFulfilled(value){ console.log(value); }).catch(function onRejected(error){
console.error(error); }); • promiseΦϒδΣΫτʹͦΕͧΕcallbackΛొ • then Ͱޭ࣌ʹݺͼग़͢callback(fulfill͞Εͨ) • catchͰࣦഊ࣌ʹݺͼग़͢callback(reject͞Εͨ) • PromiseίϯετϥΫλͷॲཧ݁ՌʹΑͬͯͲͪΒ͔͕ݺΕΔ
Promiseͷശ • ࠓ·ͩͳ͍͚Ͳকདྷతʹதʢʣ͕ಘΒΕΔശ • resolve<T> or reject<Error> • ͕ೖͬͨ࣌ʹ then
or catchΛݺͿͱ͍͏ػೳΛͬͨശ • Optionalͱಉ͡(தʢʣ͕ۭ͔͠Εͳ͍ശ) • Some<T> or None • Eitherͱಉ͡(தʢʣ͕Τϥʔ͔͠Εͳ͍ശ) • Left<Error> or Right<T>
Promiseͷঢ়ଶ3͚ͭͩ • Fulfilled • resolve(ޭ)ͨ࣌͠ɺ͜ͷ࣌thenͰొͨ͠callback͕ݺΕΔ • Rejected • reject(ࣦഊ)ͨ࣌͠ɻ͜ͷ࣌ catchͰొͨ͠ίʔϧόοΫ
͕ݺΕΔ • Pending • resolve·ͨrejectͰͳ͍࣌ɻpromiseΦϒδΣΫτ͕࡞͞Εͨॳظঢ়ଶ͕֘͢Δ
Promise͍ࣺͯΦϒδΣΫτ • promiseΦϒδΣΫτҰঢ়ଶ͕มߋͨ͠ΒͦΕҎ ߱ෆม • ͭ·Γɺಉ͡PromiseΦϒδΣΫτΛ͍·Θ͞ͳ͍ (immutable) • thenৗʹ৽͍͠ΦϒδΣΫτΛ࡞ͯ͠ฦ͢
࿈తʹॻ͚Δ(promise chain) Promise.resolve(2) .then(function(v) { return v * 2; })
.then(function(v) { return v * v; }) .then(function(v) { console.log(v); }) .catch(function(e) { // Ͳ͔͜Ͱerrror͕ى͖ͨΒ͜͜Ͱcatch͞ΕΔ console.error(e); }) • thencatchϝιουνΣʔϯͳͷͰ࿈ଓͰॻ͚Δ • thencatchຖճ৽͍͠promiseΦϒδΣΫτΛฦͯ͠࿈͢Δ
Promiseͱerror handling • ίϯετϥΫλͰrejectΛฦ͢ͱcatch͞ΕΔ • PromiseͰى͖ͨΤϥʔࣗಈతʹtry-catch͞ΕɺPromiseͰcatchͰ͖ Δ • ͦΕͧΕݸผͷॲཧ͔ΒΤϥʔϋϯυϦϯά͕ͳ͘ͳΔ(reject͢Δ͚ͩ) •
ٯʹ.catchΛॻ͖ΕΔͱԿݴΘͳ͘ͳͬͯ͠·͏ • PromiseͰඇಉظॲཧʹ͕ߦ͖͕͕ͪͩΤϥʔϋϯυϦϯάͷํΛ༏ ઌͨ͠
͍ॲ • PromiseΛ͏͜ͱͰɺॲཧΛநతͳͱͯ࣋ͭ͜͠ͱ͕ՄೳʹͳΔ • ͦΕͧΕͷॲཧΛPromiseͰϥοϓͯ͠ɺΈ߹ΘͤΔ͚ͩͰྑ͘ͳ Δ • ඇಉظAPIͰೝূ͔ͯ͠ΒͰͳ͍ͱୟ͚ͳ͍APIΛ͏࣌ • ϩάΠϯAPI
+ ඇಉظ௨৴API • ඇಉظॲཧͷΤϥʔϋϯυϦϯάͷ؆ܿԽ • callbackͩͱશͯࣗͰΔඞཁ͕͋Δ
·ͱΊ • PromiseඇಉظॲཧΛPromiseΦϒδΣΫτ (ະདྷͷΛ֨ೲͨ͠ശ)ͱͯ͠ѻ͑Δ • ෳͷඇಉظॲཧΛ·ͱΊΔ࣌ʹ༗ޮ • Promiseڧ͍ΤϥʔϋϯυϦϯάΛ࣋ͬͯΔ • PromiseສೳͰͳ͍ͷͰదࡐదॴ
͋Γ͕ͱ͏͍͟͝·ͨ͠
see also • Promise - JavaScript | MDN • https://developer.mozilla.org/ja/docs/Web/JavaScript/
Reference/Global_Objects/Promise • JavaScript Promiseͷຊ • http://azu.github.io/promises-book • ࠓߋ͚ͩͲPromiseೖ • http://qiita.com/koki_cheese/items/c559da338a3d307c9d88