Dart 中是否有相当于 Javascript 的 `resolve` 函数(来自 Promise 构造函数)?

gos*_*oy5 1 javascript dom asynchronous promise dart

我想创建一个返回未来的函数。值将在特定时间解析。但是,该值必须从回调内部解析。在 Javascript 中,我可以做这样的事情:

function delay(seconds) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, seconds * 1000);
  });
}
Run Code Online (Sandbox Code Playgroud)

我在 Dart 中没有看到任何明确的解决方案,有人可以告诉我一种方法来做到这一点(或解决这个问题的方法)吗?如果您需要任何澄清,请随时提出评论。

编辑:为了更清楚,我将提供我创建的上下文和源代码。

我正在尝试创建一个在元素发生单个事件后返回的函数(实际上是方法)。我首先用 Javascript 写的 -

HTMLElement.prototype.on = function(eventName) {
    return new Promise(function(resolve, reject) {
        var handler = function(event) {
            resolve(null);
            this.removeEventListener(eventName, handler);
        };
        this.addEventListener(eventName, handler);
    });
};
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它await myButton.on("click"); alert("Button clicked first time");

为了玩转,我尝试在 Dart + HTML 中重新创建它,这是到目前为止的代码。

import "dart:html";

extension on HtmlElement {
  on(String name) {
    void handler(Event event) {
      removeEventListener(name, handler);
      // Do something to actually return from the method...
    }

    addEventListener(name, handler);
  }
}

void main() {}
Run Code Online (Sandbox Code Playgroud)

编辑:对于好奇的人,可以在此处此处找到完整的代码 。

jam*_*lin 11

我不熟悉 JavaScript Promise,但假设您只想在函数至少执行一次await myButton.on("click")后完成,您可以使用:handlerCompleter

import "dart:async";
import "dart:html";

extension on HtmlElement {
  Future<void> on(String name) {
    final completer = Completer<void>();

    void handler(Event event) {
      removeEventListener(name, handler);
      completer.complete();
    }

    addEventListener(name, handler);
    return completer.future;
  }
}
Run Code Online (Sandbox Code Playgroud)