回答編集履歴
3
解説を追記
test
CHANGED
@@ -62,7 +62,9 @@
|
|
62
62
|
|
63
63
|
while( x = obj.shift() ) {
|
64
64
|
|
65
|
+
if (x.v)
|
66
|
+
|
65
|
-
|
67
|
+
yield x.v
|
66
68
|
|
67
69
|
else {
|
68
70
|
|
@@ -113,3 +115,15 @@
|
|
113
115
|
getFile("5.txt");
|
114
116
|
|
115
117
|
```
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
不要と思いますが解説。
|
122
|
+
|
123
|
+
`[{k:'1.txt', v:'1st request'}, ...]`のような構造体を作り、`Proxy`により独自アクセサを設定することによって、順序型であることを意識せずにプロパティにアクセスするようにしました。
|
124
|
+
|
125
|
+
また、`Symbol.iterator`の`getter`に出力の際のめんどくさい処理を設定することにより、列挙するだけで出力が得られるようになっています。
|
126
|
+
|
127
|
+
その結果、元コードに追加したのは3行のみ、というシンプルなコードになったと思います。
|
128
|
+
|
129
|
+
(Falsyな値が来るといろいろバグりますけど)
|
2
Symbol.iterator 使えばいいじゃん!
test
CHANGED
@@ -3,8 +3,6 @@
|
|
3
3
|
負けないぞう!
|
4
4
|
|
5
5
|
```javascript
|
6
|
-
|
7
|
-
// ajaxのフェイクバージョンのつもり
|
8
6
|
|
9
7
|
function fakeAjax(url, callback){
|
10
8
|
|
@@ -44,7 +42,7 @@
|
|
44
42
|
|
45
43
|
q[url] = response;
|
46
44
|
|
47
|
-
q
|
45
|
+
[...q].forEach( x => console.log(x) );
|
48
46
|
|
49
47
|
});
|
50
48
|
|
@@ -52,23 +50,19 @@
|
|
52
50
|
|
53
51
|
|
54
52
|
|
55
|
-
const output = Symbol('output');
|
56
|
-
|
57
53
|
const q = new Proxy([],{
|
58
54
|
|
59
55
|
get: function(obj, prop) {
|
60
56
|
|
61
|
-
if (prop===o
|
57
|
+
if (prop===Symbol.iterator) {
|
62
58
|
|
63
|
-
if (obj.length) return
|
59
|
+
if (obj.length) return function*(){
|
64
60
|
|
65
|
-
let x
|
61
|
+
let x;
|
66
62
|
|
67
|
-
while( x ) {
|
63
|
+
while( x = obj.shift() ) {
|
68
64
|
|
69
|
-
if (x.v)
|
70
|
-
|
71
|
-
yield x.v
|
65
|
+
if (x.v) yield x.v
|
72
66
|
|
73
67
|
else {
|
74
68
|
|
@@ -82,7 +76,7 @@
|
|
82
76
|
|
83
77
|
if (!x) yield 'all done!';
|
84
78
|
|
85
|
-
}
|
79
|
+
};
|
86
80
|
|
87
81
|
}
|
88
82
|
|
@@ -98,7 +92,7 @@
|
|
98
92
|
|
99
93
|
entry.v = value
|
100
94
|
|
101
|
-
else
|
95
|
+
else
|
102
96
|
|
103
97
|
obj.push({k:prop, v:value});
|
104
98
|
|
1
読み面杉
test
CHANGED
@@ -62,11 +62,13 @@
|
|
62
62
|
|
63
63
|
if (obj.length) return [...(function*(){
|
64
64
|
|
65
|
-
let x;
|
65
|
+
let x = obj.shift();
|
66
66
|
|
67
|
-
while( x
|
67
|
+
while( x ) {
|
68
68
|
|
69
|
+
if (x.v)
|
70
|
+
|
69
|
-
|
71
|
+
yield x.v
|
70
72
|
|
71
73
|
else {
|
72
74
|
|
@@ -90,11 +92,15 @@
|
|
90
92
|
|
91
93
|
set: function(obj, prop, value){
|
92
94
|
|
93
|
-
let entry;
|
95
|
+
let entry = obj.filter( x => x.k == prop )[0];
|
94
96
|
|
95
|
-
if (entry
|
97
|
+
if (entry)
|
96
98
|
|
99
|
+
entry.v = value
|
100
|
+
|
101
|
+
else
|
102
|
+
|
97
|
-
|
103
|
+
obj.push({k:prop, v:value});
|
98
104
|
|
99
105
|
},
|
100
106
|
|