23. 2-1-1. プロミス型を定義する
オレオレクラス構文を勝手に導入して書き直すと…
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
← Callbackを格納するプロパティ
← Callbackを予約するメソッド
← 予約されたCallbackを実行する
メソッド (リゾルバ)
← コンストラクタ。
外部から渡されてきた
クロージャにリゾルバを
渡している。
24. 2-1-1. プロミス型を定義する
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
こう動いて欲しい(動くとは言ってない)
25. 2-1-1. プロミス型を定義する
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
26. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
27. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
28. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
29. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
30. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
31. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
32. 2-1-1. プロミス型を定義する
class Promise {
var callback = …;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
33. 2-1-1. プロミス型を定義する
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
実際はこうなってしまう!
34. 2-1-1. プロミス型を定義する
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
35. 2-1-1. プロミス型を定義する
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
36. 2-1-1. プロミス型を定義する
class Promise {
var callback = null;
function then(cb) {
callback = cb;
}
function resolve(value) {
callback(value);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
doSomething().then(function(value) {
console.log('Got a value:' + value);
});
38. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
39. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
40. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
41. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
42. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
43. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
44. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
45. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
46. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
47. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
48. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
49. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
50. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
var value = 42;
resolve(value);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
promise.then(function(value) {
console.log('Got a value:' + value);
});
51. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
52. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
53. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
54. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
55. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
56. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
57. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
58. 3.Promiseは状態を持っている
class Promise {
var state = 'pending';
var value;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
59. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
60. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
61. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
62. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
63. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
64. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
65. 3.Promiseは状態を持っている
class Promise {
var state = 'resolved';
var value = 42;
var deferred = …;
function resolve(newValue) {
value = newValue;
state = 'resolved';
if (deferred) { handle(deferred); }
}
function handle(onResolved) {
if (state === 'pending') {
deferred = onResolved;
return;
}
onResolved(value);
}
function then(onResolved) {
handle(onResolved);
}
function Promise(fn) {
fn(resolve);
}
}
function doSomething() {
return new Promise(function(resolve) {
setTimeout(function () {
var value = 42;
resolve(value);
}, 114514);
});
}
var promise = doSomething();
promise.then(function(value) {
console.log('Got a value:' + value);
});
sleep(114514);
promise.then(function(value) {
console.log('Got a value:' + value);
});
78. 即時に resolve / reject する
無理矢理つかってみよう
var a = (i) => Promise.resolve(i + 1);
var b = (i) => Promise.resolve(i + 1);
var c = (i) => Promise.resolve(i + 1);
var d = (i) => console.log(i);
a(10).then(b).then(c).then(d);
13
79. 途中からは return = resolve
実はこう書いても自動的に Promise.resolve してくれる
var a = (i) => Promise.resolve(i + 1);
var b = (i) => i + 1;
var c = (i) => i + 1;
var d = (i) => console.log(i);
a(10).then(b).then(c).then(d);
80. Promise で並列処理 (all)
• 同時にスタートして全部の成功を期待する
var waitSec = (i) => {
console.log('I wait for ' + i + ' sec');
return new Promise((resolve, reject) => {
setTimeout(() => resolve(i), i * 1000);
});
};
var promises = [waitSec(1), waitSec(2), waitSec(3)];
Promise.all(promises)
.then(results => console.log(results));
I wait for 1 sec
I wait for 2 sec
I wait for 3 sec
[1, 2, 3]
81. Promise で並列処理 (race)
• 同時にスタートして一番早い成功または失敗を受け付ける
⇛ 一番早い「成功のみ」ってどうやって書くの?
⇛ 「Promise.any」でググるとライブラリとかあるよ
var waitSec = (i) => {
console.log('I wait for ' + i + ' sec');
return new Promise((resolve, reject) => {
setTimeout(() => resolve(i), i * 1000);
});
};
var promises = [waitSec(1), waitSec(2), waitSec(3)];
Promise.race(promises)
.then(result => console.log(result));
I wait for 1 sec
I wait for 2 sec
I wait for 3 sec
1
88. Generator を活用
var foo = (i) => {
return Promise.resolve(i).then((i) => {
return i + 1;
}).then((i) => {
return i + 1;
}).then((i) => {
return i + 1;
}).then((i) => {
return i + 1;
})
};
foo(1).then((i) => console.log(i));
var co = require('co');
var gen = function *(i) {
i = yield i + 1;
i = yield i + 1;
i = yield i + 1;
yield i + 1;
};
co(gen(1)).then(i => console.log(i));
89. ECMAScript 7 だと…
var co = require('co');
var gen = function *(i) {
i = yield i + 1;
i = yield i + 1;
i = yield i + 1;
yield i + 1;
};
co(gen(1)).then(i => console.log(i));
• async / await という C# のような構文が使える
• その代わりクロージャは使えない
async function foo(i) {
i = await i + 1;
i = await i + 1;
i = await i + 1;
return await i + 1;
};
foo(1).then(i => console.log(i));