[英]How to let JavaScript wait until certain event happens?
我正在編寫具有以下結構的網頁:
為了保證正確性,只有在另一個表完全更新(即完成計算)之后才需要更新該表。 但是,我不知道如何有效地實現這一點,而且我在 JavaScript 中找不到任何
wait<\/code>工具。
目前,我正在使用以下方法:
聲明一個updated<\/code>的全局變量並將其false<\/code> ;
<\/li>
在第一個表收到輸入后,我創建了一個空的while<\/code>循環,直到updated<\/code>為true<\/code> ;
<\/li>
添加一個監聽器,一旦計算完成並接收到事件,設置updated<\/code>為true<\/code> 。
<\/li><\/ol> 這對我來說似乎不直觀,但我想不出任何其他方法。 有什么好的方法可以做到這一點嗎?
感謝您的任何投入!
添加一個監聽器,一旦完成計算並收到事件,將更新設置為true。
相反的設置updated
為true,然后等待updated
是剛剛道道做任何你想做的聽眾做。
myEventBus.addListener(function () {
// do whatever
updateTable();
alert('table updated!');
});
做空循環是一個壞主意。 您不僅可以刻錄CPU周期,而且Javacript是單線程的,因此您將永遠循環,而不會讓任何人有機會更改變量。
您可以做的是重寫具有其他人的表格,以“觸發事件本身”。 有很多方法可以做到這一點,但基本上你只是想讓它調用一個“延續”函數而不是盲目返回。這個函數可以預定義,或者你可以把它作為參數傳遞給某個地方。
//this is just illustrative
//Your actual code will be probably very different from this.
function update_part(){
//do something
signal_finished_part()
}
var parts_done = 0;
function signal_finished_part(){
parts_done ++;
if(parts_done >= 5){
signal_all_parts_done();
}
}
function signal_all_parts_done()
{
//do something to table A
}
您可以為更新的任何觸發器編寫回調函數。 為了避免混亂的回調,您也可以使用promises,並根據更新操作中檢索的數據更新表的某些部分。 接受建議。
在 2022 年,擁有一個觸發 Promise(可用於 Promise 鏈或 async/await 代碼)的事件監聽器非常有用。 一種干凈的制作方法:
function getPromiseFromEvent(item, event) { return new Promise((resolve) => { const listener = () => { item.removeEventListener(event, listener); resolve(); } item.addEventListener(event, listener); }) } async function waitForButtonClick() { const div = document.querySelector("div") const button = document.querySelector("button") div.innerText = "Waiting for you to press the button" await getPromiseFromEvent(button, "click") div.innerText = "The button was pressed!" } waitForButtonClick()
<button>ClickMe</button> <div></div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.