如何在 JavaScript 中不等待函数?

问题描述 投票:0回答:3

我有 FuncA 调用 FuncB 。我希望 FuncA 继续处理而不等待 FuncB 完成。 这在 JavaScript 中可能吗?

javascript asynchronous async-await
3个回答
1
投票

JavaScript 在单个事件循环上运行。这意味着它通常一次只能做一件事。

JavaScript 中的异步操作(通常涉及用 JavaScript 以外的语言编写的代码)发生在主事件循环之外,主事件循环完成后,会将回调函数放入队列中,以便在事件循环停止繁忙时运行。

从您的评论来看(请阅读如何询问

并在将来提供一个

最小的、可重现的示例),FuncB是一个长时间运行的JavaScript函数,它会阻塞主事件循环。纯 JavaScript 中没有任何东西可以避免它阻塞。

一些 JavaScript 实现允许您将该逻辑移到主事件循环之外,以便它在其他地方运行并且不会阻塞。

例如,如果您使用 Node.js,您可以使用

工作线程

在主事件循环之外运行一些 JS。您可以更进一步,使用

node-gyp 用 C 重写长时间运行的代码(这可能会更高效)。 另一方面,如果您正在编写在网页中运行的代码,则可以使用 Web Workers

如果您在其他环境(例如 Photoshop 插件或 Windows 脚本主机)中运行 JS,那么您需要寻找该环境的替代方案(您可能会发现自己完全不走运)。

我找到了答案。

1
投票
$(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!'); }

有多种方法可以做到这一点,基本上是启动异步任务,例如在代码中:

-1
投票
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());


© www.soinside.com 2019 - 2024. All rights reserved.