Dart中是否有等效于JavaScript Promise构造函数的resolve方法?
解决方案
Dart 中对应你在 JS 里手动控制 Promise 完成的核心类是 dart:async 库提供的 Completer,完全可以实现你的需求:
- 创建
Completer实例后,它会持有一个Future对象作为你要返回的结果 - 需要完成
Future时调用completer.complete()(对应 JS 的resolve),出错时调用completer.completeError()(对应 JS 的reject)
基础示例:delay 函数的 Dart 实现
对应你给出的 JS 版 delay 函数,Dart 实现如下:
import 'dart:async'; Future<void> delay(int seconds) { final completer = Completer<void>(); Timer(Duration(seconds: seconds), () => completer.complete()); return completer.future; }
单次事件监听的扩展方法实现
你需要的 HtmlElement 单次事件监听方法,完整代码如下:
import 'dart:html'; import 'dart:async'; extension SingleEventExtension on HtmlElement { Future<Event> on(String eventName) { final completer = Completer<Event>(); void handler(Event event) { // 触发后先移除当前监听 removeEventListener(eventName, handler); // 完成Future,可将事件对象作为返回值传递 completer.complete(event); } addEventListener(eventName, handler); return completer.future; } } void main() async { final myButton = querySelector('#myButton') as ButtonElement; // 使用方式和JS完全一致 await myButton.on('click'); window.alert('Button clicked first time'); }
补充说明
- 如果你不需要返回事件对象,可以把
Completer的泛型改为Completer<void>,调用complete()时不需要传参数 - Dart 标准库本身已经提供了单次事件监听的快捷方法:
element.on[事件名].first本身就返回一个 Future,会在第一次事件触发时完成,你也可以直接使用无需自行封装,示例如下:await myButton.onClick.first; window.alert('Clicked');
内容的提问来源于stack exchange,提问作者gosoccerboy5
相关产品推荐
相关产品推荐

