回答編集履歴

6

テキスト修正

2019/10/24 15:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -129,3 +129,85 @@
129
129
 
130
130
 
131
131
  以上、参考になれば幸いです。
132
+
133
+
134
+
135
+ ### 追記
136
+
137
+
138
+
139
+ [request のドキュメント](https://github.com/request/request#request---simplified-http-client) を眺めていましたら、これを作っている同じチームで、[Promiseでラップしたものも提供している](https://github.com/request/request#promises--asyncawait)との一節がありました。その提供されているものの中の [request/request-promise](https://github.com/request/request-promise) を使うと、以下のような感じで、もっと短く書けそうです。
140
+
141
+
142
+
143
+ ```javascript
144
+
145
+ 'use strict';
146
+
147
+ const rp = require('request-promise');
148
+
149
+ const {
150
+
151
+ JSDOM
152
+
153
+ } = require('jsdom');
154
+
155
+
156
+
157
+ const urls = [];
158
+
159
+ urls.push("https://www.example.com/xxxxxxx");
160
+
161
+ urls.push("https://www.example.com/xxxxxxx/eapg/2");
162
+
163
+ urls.push("https://www.example.com/hogehoge");
164
+
165
+ urls.push("https://www.example.com/hogehoge/eapg/2");
166
+
167
+ urls.push("https://www.example.com/hogehoge/eapg/3");
168
+
169
+ urls.push("https://www.example.com/hogehoge/eapg/4");
170
+
171
+ urls.push("https://www.example.com/hogehoge/eapg/5");
172
+
173
+ urls.push("https://www.example.com/hogehoge/eapg/6");
174
+
175
+ urls.push("https://www.example.com/hogehoge/eapg/7");
176
+
177
+ urls.push("https://www.example.com/hogehoge/eapg/8");
178
+
179
+ urls.push("https://www.example.com/hogehoge/eapg/9");
180
+
181
+
182
+
183
+ const selector = "#primary > div > div > div > article > header > h2 > a";
184
+
185
+
186
+
187
+ Promise
188
+
189
+ .all(urls.map(url => rp(url)))
190
+
191
+ .then(htmls => {
192
+
193
+ htmls.forEach((html, i) => {
194
+
195
+ console.log(urls[i]);
196
+
197
+
198
+
199
+ const dom = new JSDOM(html);
200
+
201
+ const aList = dom.window.document.querySelectorAll(selector);
202
+
203
+ console.log([...aList].map(a => `\t${a.textContent}`).join('\n'));
204
+
205
+ })
206
+
207
+ }).catch(e => {
208
+
209
+ console.error(e);
210
+
211
+ });
212
+
213
+ ```

5

テキスト修正

2019/10/24 15:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
 
126
126
 
127
- なお上記では、ご質問にある GitHubレポジトリにあるコードをもとに修正しており、URLのドメインは差し障りのないものに変えています。
127
+ なお上記では、ご質問にある GitHubレポジトリにあるコードをもとに修正しており、URL差し障りのないものに変えています。
128
128
 
129
129
 
130
130
 

4

テキスト修正

2019/10/24 15:04

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  const request = require('request');
38
38
 
39
- const {JSDOM} = require('jsdom');
39
+ const { JSDOM } = require('jsdom');
40
40
 
41
41
 
42
42
 
@@ -68,53 +68,53 @@
68
68
 
69
69
  Promise
70
70
 
71
- .all(urls.map(url => printTitle(url)))
71
+ .all(urls.map(url => printTitle(url)))
72
72
 
73
- .then(ary => {
73
+ .then(results => {
74
74
 
75
- ary.forEach(e => {
75
+ results.forEach(({ url, aList }) => {
76
76
 
77
- console.log(e.url);
77
+ console.log(url);
78
78
 
79
- console.log([...e.aList].map(a => `\t${a.textContent}`).join('\n'));
79
+ console.log([...aList].map(a => `\t${a.textContent}`).join('\n'));
80
80
 
81
- })
81
+ })
82
82
 
83
- }).catch(e => {
83
+ }).catch(e => {
84
84
 
85
- console.error(e);
85
+ console.error(e);
86
86
 
87
- })
87
+ })
88
88
 
89
89
 
90
90
 
91
- function printTitle(url){
91
+ function printTitle(url) {
92
92
 
93
- return new Promise((resolve, reject) => {
93
+ return new Promise((resolve, reject) => {
94
94
 
95
- request(url, (e, response, body) => {
95
+ request(url, (e, response, body) => {
96
96
 
97
- if (e) reject(e);
97
+ if (e) reject(e);
98
98
 
99
- try {
99
+ try {
100
100
 
101
- const dom = new JSDOM(body);
101
+ const dom = new JSDOM(body);
102
102
 
103
- const selector = "#primary > div > div > div > article > header > h2 > a";
103
+ const selector = "#primary > div > div > div > article > header > h2 > a";
104
104
 
105
- const aList = dom.window.document.querySelectorAll(selector);
105
+ const aList = dom.window.document.querySelectorAll(selector);
106
106
 
107
- resolve({ url, aList });
107
+ resolve({ url, aList });
108
108
 
109
- } catch (e2) {
109
+ } catch (e2) {
110
110
 
111
- reject(e2);
111
+ reject(e2);
112
112
 
113
- }
113
+ }
114
114
 
115
- });
115
+ });
116
116
 
117
- });
117
+ });
118
118
 
119
119
  }
120
120
 

3

テキスト修正

2019/10/24 15:03

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- を使うことが考えられます。すなわち、各リクエストを[Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) にして、 すべてのリクエストが返ってきてから、`urls` の要素の順に表示するという制御を Promise.all で行います。
25
+ を使うことが考えられます。すなわち、各リクエストを[Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise) にして、 すべてのリクエストが返ってきてから、`urls` の要素の順に、各レスポンスから取得した結果を表示するという制御を Promise.all で行います。
26
26
 
27
27
 
28
28
 

2

テキスト修正

2019/10/24 14:54

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- とすることで、`urls` の先頭から順に `getTitle(url)` が実行されますが、だからといって、各URLに対するHTTP(S)リクエストの返信が、呼んだ順に返ってくるとは限りません。`urls` に入っている順で結果も得たいのであれば、すべてのリクエストが返ってきてから、それぞれの結果を、`urls` に入っている順を保って得る必要がありますが、これを実現する方法として、
17
+ とすることで、`urls` の先頭から順に `getTitle(url)` が実行されますが、だからといって、各URLに対するHTTP(S)リクエストの返信が、リクエストした順に返ってくるとは限りません。`urls` に入っている順で結果も得たいのであれば、すべてのリクエストに対するレスポンスが返ってきてから、それぞれの結果を、`urls` に入っている順を保って得る必要がありますが、これを実現する方法として、
18
18
 
19
19
 
20
20
 

1

テキスト修正

2019/10/24 14:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -42,27 +42,27 @@
42
42
 
43
43
  const urls = [];
44
44
 
45
- urls.push("https://www.example.com/blog/category/programing/node-js");
45
+ urls.push("https://www.example.com/xxxxxxx");
46
46
 
47
- urls.push("https://www.example.com/blog/category/programing/node-js/page/2");
47
+ urls.push("https://www.example.com/xxxxxxx/eapg/2");
48
48
 
49
- urls.push("https://www.example.com/blog/category/programing/javascript");
49
+ urls.push("https://www.example.com/hogehoge");
50
50
 
51
- urls.push("https://www.example.com/blog/category/programing/javascript/page/2");
51
+ urls.push("https://www.example.com/hogehoge/eapg/2");
52
52
 
53
- urls.push("https://www.example.com/blog/category/programing/javascript/page/3");
53
+ urls.push("https://www.example.com/hogehoge/eapg/3");
54
54
 
55
- urls.push("https://www.example.com/blog/category/programing/javascript/page/4");
55
+ urls.push("https://www.example.com/hogehoge/eapg/4");
56
56
 
57
- urls.push("https://www.example.com/blog/category/programing/javascript/page/5");
57
+ urls.push("https://www.example.com/hogehoge/eapg/5");
58
58
 
59
- urls.push("https://www.example.com/blog/category/programing/javascript/page/6");
59
+ urls.push("https://www.example.com/hogehoge/eapg/6");
60
60
 
61
- urls.push("https://www.example.com/blog/category/programing/javascript/page/7");
61
+ urls.push("https://www.example.com/hogehoge/eapg/7");
62
62
 
63
- urls.push("https://www.example.com/blog/category/programing/javascript/page/8");
63
+ urls.push("https://www.example.com/hogehoge/eapg/8");
64
64
 
65
- urls.push("https://www.example.com/blog/category/programing/javascript/page/9");
65
+ urls.push("https://www.example.com/hogehoge/eapg/9");
66
66
 
67
67
 
68
68