Dart 中是否有等同于 Javascript 的“resolve”函数(来自 Promise 构造函数)?

Is there an equivalent of Javascript's `resolve` function (from the Promise constructor) in Dart?

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

function delay(seconds) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, seconds * 1000);
  });
}

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

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

我正在尝试创建一个函数(实际上是方法),在元素发生单个事件后 returns。我先写在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);
    });
};

你可以这样使用它: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() {}

编辑:对于好奇的人,可以找到完整的代码 here or here

我不熟悉 JavaScript Promises,但假设您希望 await myButton.on("click") 仅在 handler 函数至少执行一次后才完成,你可以使用 Completer:

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;
  }
}

一个 Promise 最多可以解析 一次 次,因此在第一次点击后自动删除事件侦听器可能是有意义的。而不是修改 HtmlElement.prototype 这是一种不卫生的做法,编写一个简单的 onclick 函数接受 HtmlElement 作为输入 -

function onclick(elem) {
  return new Promise(r =>
    elem.addEventListener("click", r, {once: true})
  )
}

function main () {
  onclick(document.forms.myapp.mybutton)
    .then(event => console.log(event.target))
    
  onclick(document.forms.myapp.otherbutton)
    .then(event => console.log(event.target))
}

main()
<form id="myapp">
  <button type="button" name="mybutton">A</button>
  <button type="button" name="otherbutton">B</button>
</form>