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() {}
我不熟悉 JavaScript Promise
s,但假设您希望 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>
我想创建一个 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() {}
我不熟悉 JavaScript Promise
s,但假设您希望 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>