toJS 属性
一个JSPromise,它要么使用完成的Future的结果来解析,要么用一个包含其错误的对象来拒绝。
拒绝的对象包含原始错误作为属性error
中的JSBoxedDartObject,以及原始堆栈跟踪作为属性stack
中的String。
实现
JSPromise<T> get toJS {
return JSPromise<T>((JSFunction resolve, JSFunction reject) {
this.then((JSAny? value) {
resolve.callAsFunction(resolve, value);
return value;
}, onError: (Object error, StackTrace stackTrace) {
// TODO(srujzs): Can we do something better here? This is pretty much
// useless to the user unless they call a Dart callback that consumes
// this value and unboxes.
final errorConstructor = globalContext['Error'] as JSFunction;
final wrapper = errorConstructor.callAsConstructor<JSObject>(
"Dart exception thrown from converted Future. Use the properties "
"'error' to fetch the boxed error and 'stack' to recover "
"the stack trace."
.toJS);
wrapper['error'] = error.toJSBox;
wrapper['stack'] = stackTrace.toString().toJS;
reject.callAsFunction(reject, wrapper);
return wrapper;
});
}.toJS);
}