我有 FuncA 呼叫 FuncB 。我希望 FuncA 繼續處理而不等待 FuncB 完成。這在javascript中可能嗎?
謝謝你 。
uj5u.com熱心網友回復:
JavaScript 在單個事件回圈上運行。這意味著它通常一次只能做一件事。
JavaScript 中的異步操作(通常涉及用 JavaScript 以外的語言撰寫的代碼)發生在主事件回圈之外,當完成時,將回呼函式放入佇列中,以便在事件回圈停止忙碌時運行。
從您的評論來看(請閱讀How to Ask并在未來提供一個最小的、可重現的示例FuncB),這是一個長時間運行的 JavaScript 函式,它阻塞了主事件回圈。純 JavaScript 中沒有任何東西可以避免它阻塞。
一些 JavaScript 實作允許您將該邏輯移到主事件回圈之外,以便它在其他地方運行并且不會阻塞。
例如,如果您使用的是 Node.js,您可以使用作業執行緒在主事件回圈之外運行一些 JS。您可以更進一步,使用node-gyp用 C 重寫您的長時間運行的代碼(這可能會更高效)。
另一方面,如果您正在撰寫代碼以在網頁中運行,則可以使用Web Workers。
如果您在其他環境中運行 JS(例如 Photoshop 插件,或在 Windows 腳本主機上),那么您需要為該環境尋找替代方案(您可能會發現自己完全不走運)。
uj5u.com熱心網友回復:
既然我找到了答案,我想分享它,以便其他人可以使用它。
$(document).ready(function () {
console.log("started");
processA();
});
function delay() {
return new Promise(resolve => setTimeout(resolve, 0));
}
async function delayedLog(j) {
await delay();
document.getElementById("dv1").innerHTML = "<br/>" j;
}
async function delayedLog2(j) {
await delay();
document.getElementById("dv2").innerHTML = "<br/>" j;
}
async function processA() {
processB();
for (var k = 0; k < 100000; k ) {
await delayedLog(k);
}
console.log('Done!');
}
async function processB() {
for (var j = 0; j < 100000; j ) {
await delayedLog2(j);
}
console.log('DoneB!');
}
uj5u.com熱心網友回復:
有多種方法可以做到這一點,基本上是啟動一個異步任務,例如在代碼中:
function FuncB() {
console.log("FuncB started");
for (var t = 0; t < 100; t ) {
console.log("value of t funcB" t);
}
}
function FuncA() {
console.log('calling');
FuncB();
console.log("FuncA loading ...")
for (var t = 0; t < 100; t ) {
console.log("value of t" t);
}
}
...在這些上啟動FuncB()內部FuncA():
setImmediate(() => FuncB());
setTimeout(() => FuncB());
Promise.resolve().then(() => FuncB());
..或者如果您在 NodeJS 中,您也可以使用:
process.nextTick(() => FuncB());
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494479.html
標籤:javascript 异步 异步等待
上一篇:將Action<T,T,T>轉換為Task<T,T,T>?
下一篇:回呼的順序是如何安排的?
