I want to create a function that returns a future. A value will be resolved at a specific time. However, the value will have to be resolved from inside a callback. In Javascript, I could do something like this:
function delay(seconds) {
return new Promise((resolve, reject) => {
setTimeout(resolve, seconds * 1000);
});
}
I don't see any clear solution for this in Dart, could anyone show me a way to do this (or a way around this)? If you need any clarification, feel free to ask a comment.
Edit: to be more clear, I'll provide context and source code I've created.
I am trying to make a function (method, really) that returns after a single event happening to an element. I first wrote it in 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);
});
};
and you can use it like this: await myButton.on("click"); alert("Button clicked first time");
.
I'm trying to recreate it in Dart HTML for the sake of toying around, and here's the code so far.
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() {}
CodePudding user response:
I'm not familiar with JavaScript Promise
s, but presuming that you want await myButton.on("click")
to complete only after the handler
function has executed at least once, you can use a 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;
}
}