OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * A [Future] is used to obtain a value sometime in the future. Receivers of a | 6 * A [Future] is used to obtain a value sometime in the future. Receivers of a |
7 * [Future] can obtain the value by passing a callback to [then]. For example: | 7 * [Future] can obtain the value by passing a callback to [then]. For example: |
8 * | 8 * |
9 * Future<int> future = getFutureFromSomewhere(); | 9 * Future<int> future = getFutureFromSomewhere(); |
10 * future.then((value) { | 10 * future.then((value) { |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 * returned future will be a list of all the values that were produced.) | 194 * returned future will be a list of all the values that were produced.) |
195 */ | 195 */ |
196 static Future<List> wait(List<Future> futures) { | 196 static Future<List> wait(List<Future> futures) { |
197 if (futures.isEmpty()) { | 197 if (futures.isEmpty()) { |
198 return new Future<List>.immediate(const []); | 198 return new Future<List>.immediate(const []); |
199 } | 199 } |
200 | 200 |
201 Completer completer = new Completer<List>(); | 201 Completer completer = new Completer<List>(); |
202 Future<List> result = completer.future; | 202 Future<List> result = completer.future; |
203 int remaining = futures.length; | 203 int remaining = futures.length; |
204 List<Object> values = new List(futures.length); | 204 List values = new List(futures.length); |
205 | 205 |
206 // As each future completes, put its value into the corresponding | 206 // As each future completes, put its value into the corresponding |
207 // position in the list of values. | 207 // position in the list of values. |
208 for (int i = 0; i < futures.length; i++) { | 208 for (int i = 0; i < futures.length; i++) { |
209 // TODO(mattsh) - remove this after bug | 209 // TODO(mattsh) - remove this after bug |
210 // http://code.google.com/p/dart/issues/detail?id=333 is fixed. | 210 // http://code.google.com/p/dart/issues/detail?id=333 is fixed. |
211 int pos = i; | 211 int pos = i; |
212 Future future = futures[pos]; | 212 Future future = futures[pos]; |
213 future.then((Object value) { | 213 future.then((Object value) { |
214 values[pos] = value; | 214 values[pos] = value; |
215 if (--remaining == 0 && !result.isComplete) { | 215 if (--remaining == 0 && !result.isComplete) { |
216 completer.complete(values); | 216 completer.complete(values); |
217 } | 217 } |
218 }); | 218 }); |
219 future.handleException((exception) { | 219 future.handleException((exception) { |
220 if (!result.isComplete) completer.completeException(exception); | 220 if (!result.isComplete) completer.completeException(exception); |
221 return true; | 221 return true; |
222 }); | 222 }); |
223 } | 223 } |
224 return result; | 224 return result; |
225 } | 225 } |
226 } | 226 } |
OLD | NEW |