有没有一种方法可以在不涉及 Web API 的情况下编写异步 code/function?

Is there a way to write asynchronous code/function without any involvement of Web APIs?

我知道这听起来很愚蠢,因为 javascript 是单线程的,但不禁想到一个函数需要不寻常的时间而没有像这样的 Web API 的参与

console.log("start")

function apple() {
  let appleCount = 10;
  while (appleCount < 1000000) {
    appleCount = appleCount + 10;
    appleCount = appleCount * 0.0000052
  }
}

apple();
console.log("end")

有没有办法 运行 这个 apple 函数异步运行...我在浏览器中尝试 运行ning 这段代码但没有得到任何结果...帮帮我..

so is there a way to run this apple function asynchronously?

如果你不想等到你的苹果函数完成,那么你可以使用Async Functions.

注意:Async/Promises不是真正的异步。

console.log("start")

async function apple() {
  let appleCount = 10;
  while (appleCount < 1000000) {
    appleCount = appleCount + 10;
    appleCount = appleCount * 0.0000052
  }
}

apple().then(() => console.log("Apple completed"));
console.log("end")

但是如果你想在另一个线程上运行它,那么你应该使用Workers

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API

你只需要return承诺。

function double(num) {
  return Promise.resolve(num * 2);
}

function add5(num){
  return Promise.resolve(num + 5);
}

double(1)// 2
    .then(add5)// 7
    .then(double)// 14
    .then(console.log)

运行 像您的 apple() 函数那样 100% 纯 Javascript 的东西的唯一方法是 运行它在不同的线程(在 nodejs 中,使用 WorkerThread)或在不同的进程中。

您似乎知道主线程 运行 是您的 Javascript 在单个线程中,因此任何简单的 JavaScript 都会在 [=29] 时占用该单个线程=]宁。为了让它不占用单个线程并阻塞事件循环,您必须 运行 它在不同的线程中, WorkerThread 或 运行 它在另一个进程中。


可以使用 setTimeout(apple, 100)setImmediate(apple) 甚至 Promise.resolve().then(apple) 等计时技巧来更改代码 运行s 的时间(启动时延迟),但所有这些计时技巧会在代码开始 运行ning 时发生变化。在所有这些情况下,当它 运行s 时,它仍然阻塞并占用主线程并在其 运行ning 时阻塞事件循环。


仅供参考,nodejs中有很多异步操作不一定是web APIs。比如有asynchronous fileAPIs和cryptoAPIs是异步非阻塞的。因此,您的问题应该修改为不仅涉及网络 APIs,还涉及任何异步 API.