我試圖了解異步函式在 JavaScript 中是如何作業的以及如何撰寫它們,但在我看來,該語言處理異步函式的方式非常有限,但我可能是錯的,并且可能我不理解它。
我在 Windows 10 X64 上使用 Visual Studio Code (v. 1.66.2) 和 Chrome (v 100.0.4896.88)。
僅出于實驗目的,我撰寫了一個簡單的heavyLoad()函式,它獲取延遲引數(表示毫秒值)并true在時間過去后回傳:
function heavyLoad(delay) {
let startTime = (new Date()).getTime();
while(new Date().getTime() < startTime delay);
return true;
}
如果我寫:
heavyLoad(5000);
console.log(“Hello”);
console.log()顯然,該函式在 5 秒后執行,因為我必須等待該heavyLoad()函式結束。
我正在嘗試將heavyLoad()函式設為異步,以便我可以在瀏覽器控制臺中立即讀取Hello而無需等待heavyLoad()函式,但我無法做到這一點:我試圖創建一個Promise物件;我嘗試使用關鍵字,但沒有任何效果,因為在閱讀Helloasync之前我總是等待heavyLoad()函式結束。
是否有可能heavyLoad()按照我的意思使功能本質上是異步的?
uj5u.com熱心網友回復:
你可以使用WebWorker和Promise
將您的多載腳本寫入單獨的檔案中。
worker.js
onmessage = function(e) {
let startTime = (new Date()).getTime();
while(new Date().getTime() < startTime e.data);
postMessage(true);
}
在主腳本檔案中運行該 webWorker。
main.js
function heavyLoad(delay) {
return new Promise((resolve, reject) => {
var myWorker = new Worker('worker.js');
myWorker.postMessage(delay);
myWorker.addEventListener('message', function(e) {
// Log the workers message.
resolve(e.data);
}, { once: true });
})
}
console.log("Starting")
console.time()
heavyLoad(5000).then(data=>{
console.timeEnd()
})
console.log("end")
(這里我使用 console.time 方法來跟蹤執行時間)
uj5u.com熱心網友回復:
對于超時,javascript中有setTimeout()方法。
所以你可以簡單地使用:
setTimeout(() => {
console.log("Hello");
}, 5000);
uj5u.com熱心網友回復:
嘗試以下代碼以了解異步作業
function heavyLoad(delay) {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(true)
},delay)
})
}
heavyLoad(5000).then(value=>{
console.log(value)
});
console.log("Hello");
它將hello在您運行代碼時首先列印,然后true在 5 秒后列印。
uj5u.com熱心網友回復:
您必須使用 Settimeout 功能,因為您想延遲該功能只要您愿意,并且 setTimeout 將充當異步功能,因此您將立即注銷 hello
function heavyLoad(delay) {
setTimeout(() => {
return true
},delay);
}
heavyLoad(5000);
console.log("hello");
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462295.html
標籤:javascript 异步 异步等待 承诺
