我有 FuncA 调用 FuncB 。我希望 FuncA 继续处理而不等待 FuncB 完成。 这在 JavaScript 中可能吗?
JavaScript 在单个事件循环上运行。这意味着它通常一次只能做一件事。
JavaScript 中的异步操作(通常涉及用 JavaScript 以外的语言编写的代码)发生在主事件循环之外,主事件循环完成后,会将回调函数放入队列中,以便在事件循环停止繁忙时运行。从您的评论来看(请阅读如何询问
并在将来提供一个最小的、可重现的示例),FuncB
是一个长时间运行的JavaScript函数,它会阻塞主事件循环。纯 JavaScript 中没有任何东西可以避免它阻塞。
一些 JavaScript 实现允许您将该逻辑移到主事件循环之外,以便它在其他地方运行并且不会阻塞。例如,如果您使用 Node.js,您可以使用
工作线程
在主事件循环之外运行一些 JS。您可以更进一步,使用node-gyp 用 C 重写长时间运行的代码(这可能会更高效)。 另一方面,如果您正在编写在网页中运行的代码,则可以使用 Web Workers
。如果您在其他环境(例如 Photoshop 插件或 Windows 脚本主机)中运行 JS,那么您需要寻找该环境的替代方案(您可能会发现自己完全不走运)。
我找到了答案。
$(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!');
}
有多种方法可以做到这一点,基本上是启动异步任务,例如在代码中:
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());