回答編集履歴
3
解説を追記
answer
CHANGED
@@ -30,7 +30,8 @@
|
|
30
30
|
if (obj.length) return function*(){
|
31
31
|
let x;
|
32
32
|
while( x = obj.shift() ) {
|
33
|
+
if (x.v)
|
33
|
-
|
34
|
+
yield x.v
|
34
35
|
else {
|
35
36
|
obj.unshift(x);
|
36
37
|
break;
|
@@ -55,4 +56,10 @@
|
|
55
56
|
getFile("3.txt");
|
56
57
|
getFile("4.txt");
|
57
58
|
getFile("5.txt");
|
58
|
-
```
|
59
|
+
```
|
60
|
+
|
61
|
+
不要と思いますが解説。
|
62
|
+
`[{k:'1.txt', v:'1st request'}, ...]`のような構造体を作り、`Proxy`により独自アクセサを設定することによって、順序型であることを意識せずにプロパティにアクセスするようにしました。
|
63
|
+
また、`Symbol.iterator`の`getter`に出力の際のめんどくさい処理を設定することにより、列挙するだけで出力が得られるようになっています。
|
64
|
+
その結果、元コードに追加したのは3行のみ、というシンプルなコードになったと思います。
|
65
|
+
(Falsyな値が来るといろいろバグりますけど)
|
2
Symbol.iterator 使えばいいじゃん!
answer
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
つまり、変なコード書いた奴が一等賞ってことですね!
|
2
2
|
負けないぞう!
|
3
3
|
```javascript
|
4
|
-
// ajaxのフェイクバージョンのつもり
|
5
4
|
function fakeAjax(url, callback){
|
6
5
|
//レスポンスまでのランダムなタイムラグをシミュレート
|
7
6
|
var time = Math.floor(Math.random()*(3000-1000)+1000);
|
@@ -21,26 +20,24 @@
|
|
21
20
|
q[url] = null;
|
22
21
|
fakeAjax(url, function(response){
|
23
22
|
q[url] = response;
|
24
|
-
|
23
|
+
[...q].forEach( x => console.log(x) );
|
25
24
|
});
|
26
25
|
}
|
27
26
|
|
28
|
-
const output = Symbol('output');
|
29
27
|
const q = new Proxy([],{
|
30
28
|
get: function(obj, prop) {
|
31
|
-
if (prop===
|
29
|
+
if (prop===Symbol.iterator) {
|
32
|
-
if (obj.length) return
|
30
|
+
if (obj.length) return function*(){
|
31
|
+
let x;
|
33
|
-
|
32
|
+
while( x = obj.shift() ) {
|
34
|
-
while( x ) {
|
35
|
-
if (x.v)
|
36
|
-
|
33
|
+
if (x.v) yield x.v
|
37
34
|
else {
|
38
35
|
obj.unshift(x);
|
39
36
|
break;
|
40
37
|
}
|
41
38
|
}
|
42
39
|
if (!x) yield 'all done!';
|
43
|
-
}
|
40
|
+
};
|
44
41
|
}
|
45
42
|
return obj.filter( x => x.k == prop )[0].v;
|
46
43
|
},
|
@@ -48,7 +45,7 @@
|
|
48
45
|
let entry = obj.filter( x => x.k == prop )[0];
|
49
46
|
if (entry)
|
50
47
|
entry.v = value
|
51
|
-
else
|
48
|
+
else
|
52
49
|
obj.push({k:prop, v:value});
|
53
50
|
},
|
54
51
|
});
|
1
読み面杉
answer
CHANGED
@@ -30,9 +30,10 @@
|
|
30
30
|
get: function(obj, prop) {
|
31
31
|
if (prop===output) {
|
32
32
|
if (obj.length) return [...(function*(){
|
33
|
-
let x;
|
34
|
-
|
33
|
+
let x = obj.shift();
|
34
|
+
while( x ) {
|
35
|
+
if (x.v)
|
35
|
-
|
36
|
+
yield x.v
|
36
37
|
else {
|
37
38
|
obj.unshift(x);
|
38
39
|
break;
|
@@ -44,9 +45,11 @@
|
|
44
45
|
return obj.filter( x => x.k == prop )[0].v;
|
45
46
|
},
|
46
47
|
set: function(obj, prop, value){
|
47
|
-
let entry;
|
48
|
-
|
48
|
+
let entry = obj.filter( x => x.k == prop )[0];
|
49
|
+
if (entry)
|
50
|
+
entry.v = value
|
51
|
+
else
|
49
|
-
|
52
|
+
obj.push({k:prop, v:value});
|
50
53
|
},
|
51
54
|
});
|
52
55
|
|