teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

デモのリンクを追加

2017/11/20 13:31

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -104,6 +104,8 @@
104
104
  .then console.log
105
105
  ```
106
106
 
107
+ [ES5なJavaScriptでのデモ](https://codepen.io/anon/pen/gXvmMw?editors=0012)
108
+
107
109
  とりあえずこのコードで動くための実装にしているため、かなり横着している部分があります(失敗する場合とか)。PromiseのPolyfillを頭に付けた方が良いと思いますが、CoffeeScriptの実装が見当たらなかったので、仕方が無く、それっぽいのを作りました。
108
110
 
109
111
  審査委員A「これは、Promiseの使用にあたるのでは無いかね?」

1

もしもそれがそれがPromiseのようにresolveされ、Promiseのようにthenするのなら、それはPromiseである。

2017/11/20 13:31

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -32,4 +32,84 @@
32
32
  console.log(v)
33
33
  curr
34
34
  .then console.log
35
- ```
35
+ ```
36
+
37
+ **レギュレーション違反「Promiseの使用」により失格!**
38
+
39
+ ---
40
+
41
+ Promiseが禁止なら、擬きを作れば良い。
42
+
43
+ ```CoffeeScript
44
+ # 約束擬き
45
+ class PseudoPromise
46
+ constructor: (executor) ->
47
+ executor(@resolve)
48
+
49
+ then: (func) ->
50
+ new PseudoPromise (resolve) =>
51
+ @fulifillment = (value) ->
52
+ result = func(value)
53
+ if result instanceof PseudoPromise
54
+ result.then (resultValue) ->
55
+ resolve(resultValue)
56
+ else
57
+ resolve(result)
58
+ @fulfill()
59
+
60
+ resolve: (value) =>
61
+ @value = value
62
+ @fulfill()
63
+
64
+ fulfill: () ->
65
+ if @value? and @fulifillment?
66
+ @fulifillment(@value)
67
+
68
+ @resolve = (value) ->
69
+ new PseudoPromise (resolve) ->
70
+ resolve(value)
71
+
72
+ # ajaxのフェイクバージョンのつもり
73
+ fakeAjax = (url, callback) ->
74
+ # console.log "start: #{url}"
75
+ # レスポンスまでのランダムなタイムラグをシミュレート
76
+ time = Math.floor(Math.random() * (3000 - 1000) + 1000)
77
+ responseMock =
78
+ '1.txt': '1st request'
79
+ '2.txt': '2nd request'
80
+ '3.txt': '3rd request'
81
+ '4.txt': '4th request'
82
+ '5.txt': '5th request'
83
+ setTimeout ->
84
+ # console.log "end: #{url}"
85
+ callback(responseMock[url])
86
+ , time
87
+
88
+ getFile = (url) ->
89
+ new PseudoPromise (resolve) ->
90
+ fakeAjax url, (response) ->
91
+ resolve(response)
92
+
93
+ [
94
+ getFile('1.txt')
95
+ getFile('2.txt')
96
+ getFile('3.txt')
97
+ getFile('4.txt')
98
+ getFile('5.txt')
99
+ PseudoPromise.resolve('all done!')
100
+ ].reduce (pre, curr) ->
101
+ pre.then (v) ->
102
+ console.log(v)
103
+ curr
104
+ .then console.log
105
+ ```
106
+
107
+ とりあえずこのコードで動くための実装にしているため、かなり横着している部分があります(失敗する場合とか)。PromiseのPolyfillを頭に付けた方が良いと思いますが、CoffeeScriptの実装が見当たらなかったので、仕方が無く、それっぽいのを作りました。
108
+
109
+ 審査委員A「これは、Promiseの使用にあたるのでは無いかね?」
110
+ 審査委員B「後半のコードなど、先日の失格コードそのままでは無いか!これでは新しいコードとは言わん。」
111
+ 審査委員C「それに、このPromise実装は不十分なところが多すぎる。実用的とはとても言えん。」
112
+ 私「PseudoPromiseはPromiseじゃないよ、たとえPromiseだとしても、Promiseと言う名のクラスだよ!」
113
+ 審査委員長「判定を言い渡す。ただのPromiseのパクリであり、創意工夫が見られないため失格とする。以上。」
114
+
115
+ (良い方法が思いついたら)PureScriptかOpalあたりで出直してきます・・・