Skip to content

Commit 570a71a

Browse files
committed
refactor
1 parent c0fcfea commit 570a71a

1 file changed

Lines changed: 90 additions & 8 deletions

File tree

public/stage5/tests.js

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,29 +126,111 @@ describe('ステージ5(意図通りに非同期処理を利用できる)',
126126
// 作成した promise を promisedFriends 変数に代入してください。
127127
var api = '/api/friends/';
128128
var promisedFriends = [];
129-
var fetchedFriendList = [];
130-
var fetchFriendsRecursive = function(targets){
131-
return fetchFriends(targets).then(function(res){
132-
var friends = Array.prototype.concat.apply([], res);
133-
fetchedFriendList = fetchedFriendList.concat(friends);
129+
var fetchFriendsRecursive = function(targets, list){
130+
list = list || [];
131+
return fetchFriends(targets).then(function(friends){
134132
if (friends.length == 0) {
135-
return fetchedFriendList;
133+
return list;
136134
}
137-
return fetchFriendsRecursive(friends);
135+
list = list.concat(friends);
136+
return fetchFriendsRecursive(friends, list);
138137
});
139138
};
140139

141140
var fetchFriends = function(targets){
142-
return Promise.all(targets.map(function(target){return fetchFriend(target);}));
141+
return Promise.all(targets.map(fetchFriend))
142+
.then(flatMap);
143143
};
144144
var fetchFriend = function(target){
145145
return fetch(api + target).then(function(res) {
146146
return res.json();
147147
});
148148
};
149149

150+
var flatMap = function(list){
151+
return Array.prototype.concat.apply([], list);
152+
};
153+
154+
// 作成した promise を promisedFriends 変数に代入してください。
150155
promisedFriends = fetchFriendsRecursive(['CoffeeScript']);
151156

157+
// /**
158+
// * 友人を取得する。
159+
// * @param {string} usernameToFetch 友人の取得対象のユーザー名。
160+
// * @return {Thenable<Array<string>>} 友人の配列。
161+
// */
162+
// function getFriends(usernameToFetch) {
163+
// return fetch(api + usernameToFetch)
164+
// .then(function(response) {
165+
// return response.json();
166+
// });
167+
// }
168+
169+
// /**
170+
// * 配列または配列をもつ promise を展開し、平たい配列をもつ promise を
171+
// * 返す。
172+
// * @param {Array<Thenable<T>|T>} arrayOfPromisedArray promise または、
173+
// * オブジェクトの配列。
174+
// * @return {Thenable<Array<T>>} 平たい配列をもつ promise。
175+
// * @template T
176+
// */
177+
// function flatMap(arrayOfPromisedArray) {
178+
// return Promise.all(arrayOfPromisedArray)
179+
// .then(function(arrayOfArray) {
180+
// return arrayOfArray.reduce(function(flatArray, array) {
181+
// // JavaScript には破壊的な配列結合がないので、
182+
// // Array#push を悪用することが多いです。
183+
// Array.prototype.push.apply(flatArray, array);
184+
// return flatArray;
185+
// }, []);
186+
// });
187+
// }
188+
189+
// /**
190+
// * 配列を結合する関数を返す。この関数の実行前に、結合する配列の片方を
191+
// * 指定する必要がある。
192+
// * @param {Array<T>} arrayA 関数の実行前に指定する、結合したい配列。
193+
// * @return {function(Array<T>): Array<T>} arrayA と arrayB を結合する関数。
194+
// * @template T
195+
// */
196+
// function concat(arrayA) {
197+
// return function(arrayB) {
198+
// return arrayA.concat(arrayB);
199+
// };
200+
// }
201+
202+
// /**
203+
// * 友人を再帰的に取得する。
204+
// * @param {string} usernameToFetch 友人の取得対象の名前。
205+
// * @return {Thenable<Array<string>>} 友人名の配列をもつ promise。
206+
// */
207+
// function getFriendsRecursively(usernameToFetch) {
208+
// return getFriends(usernameToFetch)
209+
// .then(function(friends) {
210+
// if (friends.length === 0) return friends;
211+
212+
// var promisedFriendsOfFriends = Promise.all(
213+
// friends.map(getFriendsRecursively));
214+
215+
// return promisedFriendsOfFriends
216+
// .then(flatMap)
217+
// .then(concat(friends));
218+
// });
219+
// }
220+
221+
// /**
222+
// * いい感じにメソッドチェーンの途中で値を出力する
223+
// * @param なんか
224+
// * @return なんか
225+
// */
226+
// function tap(object){
227+
// console.log(object);
228+
// return object;
229+
// }
230+
231+
// 作成した promise を promisedFriends 変数に代入してください。
232+
// promisedFriends = getFriendsRecursively('CoffeeScript');
233+
152234
return expect(promisedFriends).to.eventually.have.length(5)
153235
.and.have.members([
154236
'Taijilang',

0 commit comments

Comments
 (0)