回答編集履歴

2

デモのリンクを追加

2017/11/20 13:31

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -210,6 +210,10 @@
210
210
 
211
211
 
212
212
 
213
+ [ES5なJavaScriptでのデモ](https://codepen.io/anon/pen/gXvmMw?editors=0012)
214
+
215
+
216
+
213
217
  とりあえずこのコードで動くための実装にしているため、かなり横着している部分があります(失敗する場合とか)。PromiseのPolyfillを頭に付けた方が良いと思いますが、CoffeeScriptの実装が見当たらなかったので、仕方が無く、それっぽいのを作りました。
214
218
 
215
219
 

1

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

2017/11/20 13:31

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -67,3 +67,163 @@
67
67
  .then console.log
68
68
 
69
69
  ```
70
+
71
+
72
+
73
+ **レギュレーション違反「Promiseの使用」により失格!**
74
+
75
+
76
+
77
+ ---
78
+
79
+
80
+
81
+ Promiseが禁止なら、擬きを作れば良い。
82
+
83
+
84
+
85
+ ```CoffeeScript
86
+
87
+ # 約束擬き
88
+
89
+ class PseudoPromise
90
+
91
+ constructor: (executor) ->
92
+
93
+ executor(@resolve)
94
+
95
+
96
+
97
+ then: (func) ->
98
+
99
+ new PseudoPromise (resolve) =>
100
+
101
+ @fulifillment = (value) ->
102
+
103
+ result = func(value)
104
+
105
+ if result instanceof PseudoPromise
106
+
107
+ result.then (resultValue) ->
108
+
109
+ resolve(resultValue)
110
+
111
+ else
112
+
113
+ resolve(result)
114
+
115
+ @fulfill()
116
+
117
+
118
+
119
+ resolve: (value) =>
120
+
121
+ @value = value
122
+
123
+ @fulfill()
124
+
125
+
126
+
127
+ fulfill: () ->
128
+
129
+ if @value? and @fulifillment?
130
+
131
+ @fulifillment(@value)
132
+
133
+
134
+
135
+ @resolve = (value) ->
136
+
137
+ new PseudoPromise (resolve) ->
138
+
139
+ resolve(value)
140
+
141
+
142
+
143
+ # ajaxのフェイクバージョンのつもり
144
+
145
+ fakeAjax = (url, callback) ->
146
+
147
+ # console.log "start: #{url}"
148
+
149
+ # レスポンスまでのランダムなタイムラグをシミュレート
150
+
151
+ time = Math.floor(Math.random() * (3000 - 1000) + 1000)
152
+
153
+ responseMock =
154
+
155
+ '1.txt': '1st request'
156
+
157
+ '2.txt': '2nd request'
158
+
159
+ '3.txt': '3rd request'
160
+
161
+ '4.txt': '4th request'
162
+
163
+ '5.txt': '5th request'
164
+
165
+ setTimeout ->
166
+
167
+ # console.log "end: #{url}"
168
+
169
+ callback(responseMock[url])
170
+
171
+ , time
172
+
173
+
174
+
175
+ getFile = (url) ->
176
+
177
+ new PseudoPromise (resolve) ->
178
+
179
+ fakeAjax url, (response) ->
180
+
181
+ resolve(response)
182
+
183
+
184
+
185
+ [
186
+
187
+ getFile('1.txt')
188
+
189
+ getFile('2.txt')
190
+
191
+ getFile('3.txt')
192
+
193
+ getFile('4.txt')
194
+
195
+ getFile('5.txt')
196
+
197
+ PseudoPromise.resolve('all done!')
198
+
199
+ ].reduce (pre, curr) ->
200
+
201
+ pre.then (v) ->
202
+
203
+ console.log(v)
204
+
205
+ curr
206
+
207
+ .then console.log
208
+
209
+ ```
210
+
211
+
212
+
213
+ とりあえずこのコードで動くための実装にしているため、かなり横着している部分があります(失敗する場合とか)。PromiseのPolyfillを頭に付けた方が良いと思いますが、CoffeeScriptの実装が見当たらなかったので、仕方が無く、それっぽいのを作りました。
214
+
215
+
216
+
217
+ 審査委員A「これは、Promiseの使用にあたるのでは無いかね?」
218
+
219
+ 審査委員B「後半のコードなど、先日の失格コードそのままでは無いか!これでは新しいコードとは言わん。」
220
+
221
+ 審査委員C「それに、このPromise実装は不十分なところが多すぎる。実用的とはとても言えん。」
222
+
223
+ 私「PseudoPromiseはPromiseじゃないよ、たとえPromiseだとしても、Promiseと言う名のクラスだよ!」
224
+
225
+ 審査委員長「判定を言い渡す。ただのPromiseのパクリであり、創意工夫が見られないため失格とする。以上。」
226
+
227
+
228
+
229
+ (良い方法が思いついたら)PureScriptかOpalあたりで出直してきます・・・