You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:45:03