| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| @JS() |
| library webdev.web.promise; |
| |
| import 'dart:async'; |
| |
| import 'package:js/js.dart'; |
| |
| /// Dart wrapper for native JavaScript Promise class. |
| @JS('Promise') |
| class Promise<T> { |
| /// Constructs a new [Promise] object. |
| /// |
| /// The executor function is executed immediately by the Promise |
| /// implementation. The resolve and reject functions, when called, resolve or |
| /// reject the promise, respectively. If an error is thrown in the executor |
| /// function, the promise is rejected. |
| external Promise( |
| void Function(void Function(T) resolve, void Function(dynamic) reject) |
| executor, |
| ); |
| |
| /// Appends fulfillment and rejection handlers to the promise. |
| /// |
| /// Returns a new promise resolving to the return value of the called handler, |
| /// or to its original settled value if the promise was not handled. |
| external Promise<dynamic> then( |
| dynamic Function(T value) onSuccess, [ |
| dynamic Function(dynamic reason) onError, |
| ]); |
| } |
| |
| /// Returns a [Promise] that resolves once the given [future] resolves. |
| /// |
| /// This also propagates errors to the returned [Promise]. |
| Promise<T> toPromise<T>(Future<T> future) { |
| return Promise( |
| allowInterop((void Function(T) resolve, void Function(dynamic) reject) { |
| future.then(resolve).catchError(reject); |
| }), |
| ); |
| } |
| |
| /// Returns a [Future] that resolves once the given [promise] resolves. |
| /// |
| /// This also propagates [Promise] rejection through to the returned [Future]. |
| Future<T> toFuture<T>(Promise<T> promise) { |
| final completer = Completer<T>(); |
| promise.then( |
| allowInterop(completer.complete), |
| // TODO(annagrin): propagate stack trace from promise instead. |
| allowInterop((e) => completer.completeError(e, StackTrace.current)), |
| ); |
| return completer.future; |
| } |