@@ -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