| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// This library adapts ES6 generators to implement Dart's async/await. | 5 /// This library adapts ES6 generators to implement Dart's async/await. |
| 6 /// It's designed to interact with Dart's Future/Stream and follow Dart | 6 /// It's designed to interact with Dart's Future/Stream and follow Dart |
| 7 /// async/await semantics. | 7 /// async/await semantics. |
| 8 /// See https://github.com/dart-lang/sdk/issues/27315 for ideas on | 8 /// See https://github.com/dart-lang/sdk/issues/27315 for ideas on |
| 9 /// reconciling Dart's Future and ES6 Promise. | 9 /// reconciling Dart's Future and ES6 Promise. |
| 10 /// Inspired by `co`: https://github.com/tj/co/blob/master/index.js, which is a | 10 /// Inspired by `co`: https://github.com/tj/co/blob/master/index.js, which is a |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 // Wraps if future is not a native Future. | 55 // Wraps if future is not a native Future. |
| 56 if (_getRawClassType(future) !== _FutureType) { | 56 if (_getRawClassType(future) !== _FutureType) { |
| 57 future = $Future.value(future); | 57 future = $Future.value(future); |
| 58 } | 58 } |
| 59 // Chain the Future so `await` receives the Future's value. | 59 // Chain the Future so `await` receives the Future's value. |
| 60 return future.then($dynamic)(onValue, {onError: onError}); | 60 return future.then($dynamic)(onValue, {onError: onError}); |
| 61 } | 61 } |
| 62 let result = FutureT.microtask(function() { | 62 let result = FutureT.microtask(function() { |
| 63 iter = $gen.apply(null, $args)[Symbol.iterator](); | 63 iter = $gen.apply(null, $args)[Symbol.iterator](); |
| 64 var result = onValue(); | 64 var result = onValue(); |
| 65 if ($strongInstanceOf(result, FutureT) == null) { | 65 if ($isSubtype($getReifiedType(result), FutureT) == null) { |
| 66 // Chain the Future<dynamic> to a Future<T> to produce the correct | 66 // Chain the Future<dynamic> to a Future<T> to produce the correct |
| 67 // final type. | 67 // final type. |
| 68 return result.then($T)((x) => x, {onError: onError}); | 68 return result.then($T)((x) => x, {onError: onError}); |
| 69 } else { | 69 } else { |
| 70 return result; | 70 return result; |
| 71 } | 71 } |
| 72 }); | 72 }); |
| 73 // TODO(jmesserly): optimize this further. | 73 // TODO(jmesserly): optimize this further. |
| 74 _FutureType = _getRawClassType(result); | 74 _FutureType = _getRawClassType(result); |
| 75 return result; | 75 return result; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 } | 237 } |
| 238 if (!this.controller.hasListener) return; | 238 if (!this.controller.hasListener) return; |
| 239 this.controller.addError(error, stackTrace); | 239 this.controller.addError(error, stackTrace); |
| 240 } | 240 } |
| 241 } | 241 } |
| 242 '''); | 242 '''); |
| 243 | 243 |
| 244 /// Returns a Stream of T implemented by an async* function. | 244 /// Returns a Stream of T implemented by an async* function. |
| 245 asyncStar(gen, T, @rest args) => JS('', 'new #(#, #, #).controller.stream', | 245 asyncStar(gen, T, @rest args) => JS('', 'new #(#, #, #).controller.stream', |
| 246 _AsyncStarStreamController, gen, T, args); | 246 _AsyncStarStreamController, gen, T, args); |
| OLD | NEW |