| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of dart.async; | 5 part of dart.async; |
| 6 | 6 |
| 7 /// A type representing values that are either `Future<T>` or `T`. | 7 /// A type representing values that are either `Future<T>` or `T`. |
| 8 /// | 8 /// |
| 9 /// This class declaration is a public stand-in for an internal | 9 /// This class declaration is a public stand-in for an internal |
| 10 /// future-or-value generic type. References to this class are resolved to the | 10 /// future-or-value generic type. References to this class are resolved to the |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 } catch (e, s) { | 282 } catch (e, s) { |
| 283 _completeWithErrorCallback(result, e, s); | 283 _completeWithErrorCallback(result, e, s); |
| 284 } | 284 } |
| 285 }); | 285 }); |
| 286 return result; | 286 return result; |
| 287 } | 287 } |
| 288 | 288 |
| 289 /** | 289 /** |
| 290 * Wait for all the given futures to complete and collect their values. | 290 * Wait for all the given futures to complete and collect their values. |
| 291 * | 291 * |
| 292 * Returns a future which will complete once all the futures in a list are | 292 * Returns a future which will complete once all the futures in a list |
| 293 * complete. If any of the futures in the list completes with an error, | 293 * have completed. |
| 294 * the resulting future also completes with an error. Otherwise the value | |
| 295 * of the returned future will be a list of all the values that were | |
| 296 * produced. | |
| 297 * | 294 * |
| 298 * If `eagerError` is true, the future completes with an error immediately on | 295 * The value of the returned future will be a list of all the values that |
| 299 * the first error from one of the futures. Otherwise all futures must | 296 * were produced. |
| 300 * complete before the returned future is completed (still with the first | |
| 301 * error to occur, the remaining errors are silently dropped). | |
| 302 * | 297 * |
| 303 * If [cleanUp] is provided, in the case of an error, any non-null result of | 298 * If any of the given futures completes with an error, then the returned |
| 304 * a successful future is passed to `cleanUp`, which can then release any | 299 * future completes with that error. If other futures complete with errors, |
| 305 * resources that the successful operation allocated. | 300 * those errors are discarded. |
| 301 * |
| 302 * If `eagerError` is true, the returned future completes with an error |
| 303 * immediately on the first error from one of the futures. Otherwise all |
| 304 * futures must complete before the returned future is completed (still with |
| 305 * the first error; the remaining errors are silently dropped). |
| 306 * |
| 307 * In the case of an error, [cleanUp] (if provided), is invoked on any |
| 308 * non-null result of successful futures. |
| 309 * This makes it posible to `cleanUp` resources that would otherwise be |
| 310 * lost (since the returned future does not provide access to these values). |
| 311 * The [cleanup] function is unused if there is no error. |
| 306 * | 312 * |
| 307 * The call to `cleanUp` should not throw. If it does, the error will be an | 313 * The call to `cleanUp` should not throw. If it does, the error will be an |
| 308 * uncaught asynchronous error. | 314 * uncaught asynchronous error. |
| 309 */ | 315 */ |
| 310 static Future<List<T>> wait<T>(Iterable<Future<T>> futures, | 316 static Future<List<T>> wait<T>(Iterable<Future<T>> futures, |
| 311 {bool eagerError: false, void cleanUp(T successValue)}) { | 317 {bool eagerError: false, void cleanUp(T successValue)}) { |
| 312 final _Future<List<T>> result = new _Future<List<T>>(); | 318 final _Future<List<T>> result = new _Future<List<T>>(); |
| 313 List<T> values; // Collects the values. Set to null on error. | 319 List<T> values; // Collects the values. Set to null on error. |
| 314 int remaining = 0; // How many futures are we waiting for. | 320 int remaining = 0; // How many futures are we waiting for. |
| 315 var error; // The first error from a future. | 321 var error; // The first error from a future. |
| (...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 AsyncError replacement = Zone.current.errorCallback(error, stackTrace); | 847 AsyncError replacement = Zone.current.errorCallback(error, stackTrace); |
| 842 if (replacement != null) { | 848 if (replacement != null) { |
| 843 error = _nonNullError(replacement.error); | 849 error = _nonNullError(replacement.error); |
| 844 stackTrace = replacement.stackTrace; | 850 stackTrace = replacement.stackTrace; |
| 845 } | 851 } |
| 846 result._completeError(error, stackTrace); | 852 result._completeError(error, stackTrace); |
| 847 } | 853 } |
| 848 | 854 |
| 849 /** Helper function that converts `null` to a [NullThrownError]. */ | 855 /** Helper function that converts `null` to a [NullThrownError]. */ |
| 850 Object _nonNullError(Object error) => error ?? new NullThrownError(); | 856 Object _nonNullError(Object error) => error ?? new NullThrownError(); |
| OLD | NEW |