我想創建一個回傳未來的函式。將在特定時間決議值。但是,必須從回呼內部決議該值。在 Javascript 中,我可以這樣做:
function delay(seconds) {
return new Promise((resolve, reject) => {
setTimeout(resolve, seconds * 1000);
});
}
我在 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);
});
};
你可以使用它像這樣: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() {}
編輯:出于好奇,可以在此處或此處找到完整的代碼 。
uj5u.com熱心網友回復:
我不熟悉 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;
}
}
uj5u.com熱心網友回復:
一個承諾最多可以解決一個時間,所以它可能是有意義的首次點擊后,自動洗掉事件偵聽器。而不是修改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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318142.html
標籤:javascript 镖 异步 dom 承诺
上一篇:將陣列中的每個元素顯示到DOM
