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

回答編集履歴

3

解説を追記

2017/11/20 11:07

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア37595

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
- if (x.v) yield x.v
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 使えばいいじゃん!

2017/11/20 11:07

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア37595

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
- q[output].forEach( x => console.log(x) );
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===output) {
29
+ if (prop===Symbol.iterator) {
32
- if (obj.length) return [...(function*(){
30
+ if (obj.length) return function*(){
31
+ let x;
33
- let x = obj.shift();
32
+ while( x = obj.shift() ) {
34
- while( x ) {
35
- if (x.v)
36
- yield x.v
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

読み面杉

2017/11/20 10:26

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア37595

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
- while( x = obj.shift() ) {
33
+ let x = obj.shift();
34
+ while( x ) {
35
+ if (x.v)
35
- if (x.v) yield x.v
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
- if (entry = obj.filter( x => x.k == prop )[0]) entry.v = value
48
+ let entry = obj.filter( x => x.k == prop )[0];
49
+ if (entry)
50
+ entry.v = value
51
+ else
49
- else obj.push({k:prop, v:value});
52
+ obj.push({k:prop, v:value});
50
53
  },
51
54
  });
52
55