Javascript 我想我理解异步、等待、承诺和回调,但我对异步代码有一个问题

Javascript 我想我理解异步、等待、承诺和回调,但我对异步代码有一个问题,javascript,asynchronous,Javascript,Asynchronous,因此,我目前正在尝试理解异步javascript。我还学习了异步等待、承诺和回调。但在所有示例中,它们都使用setTimeOut()生成异步调用 但我的问题是如何编写类似于setTimeOut函数的东西。例如,我有一个大的计算,这需要时间,我希望它不阻塞主线程。我该怎么做一个只计算很多东西但异步的函数呢 我就是受不了这件事。因为在我看来,只有通过网络调用等才能编写异步代码,但我还没有找到一种方法来编写异步for循环或类似的东西。看来您还没有完全理解什么是异步。这个词本身说它是“不同步的”。这意味

因此,我目前正在尝试理解异步javascript。我还学习了异步等待、承诺和回调。但在所有示例中,它们都使用
setTimeOut()
生成异步调用

但我的问题是如何编写类似于
setTimeOut
函数的东西。例如,我有一个大的计算,这需要时间,我希望它不阻塞主线程。我该怎么做一个只计算很多东西但异步的函数呢


我就是受不了这件事。因为在我看来,只有通过网络调用等才能编写异步代码,但我还没有找到一种方法来编写异步for循环或类似的东西。

看来您还没有完全理解什么是异步。这个词本身说它是“不同步的”。这意味着有一些运动部件不能以相同的速度运动。对于JavaScript,它归结为I/O(输入/输出)和CPU处理

网络调用(xhr)是一种I/O调用,与CPU处理速度相比,速度较慢

文件系统调用是I/O调用,与CPU的处理速度相比,它的速度较慢

数据库查询是利用网络的I/O调用,与CPU的处理速度相比速度较慢

异步代码的逻辑是“让CPU在网络或其他线路上运行时执行其他操作”

为什么要做这些介绍?因为你不能进行大规模的异步计算。它使用CPU。但是,您可以在服务工作者中执行它,让它使用不同的CPU核心,并且不会阻塞主线程


服务人员简介:

您不能。要执行异步任务,需要在另一个线程上运行代码,而这在JavaScript中是不可能的

setTimeout
是异步的,因为它触发了一个用某种低级语言(可能是C++)编写的内部函数,然后该函数将利用硬件定时器触发回调,在一段时间后调用

例如,
fetch(…)
也是异步的,因为它将启动一个内部线程,该线程通过网卡进行写入和读取,然后在请求完成时调用JavaScript引擎


这有点过于简单化了。您可以启动多个WebWorkers(多个JavaScript引擎同时运行)以获得某种多线程处理。虽然代码仍然在每个线程上同步运行,但这两个线程可以并发执行并通过消息交换信息,通过消息可以获得异步行为

  // worker.js
  onmessage = function({ data }) { // called when messages from the other thread come in
    let start = Date.now();
    while(start + 3000 > Date.now()); // some long running action
   postMessage("done"); // go back to the other thread
 }

 // main.js
 const otherThread = new WebWorker("worker.js");
 otherThread.postMessage("go!"); // launch async task in other thread
 otherThread.onmessage = function({ data }) { // receive result
  console.log(data); // "done"
 });

在主函数中使用回调函数……对于不使用的常规旧javascript,只有一个线程可以使用。如果需要执行此操作,则需要(或在node.js中)生成另一个线程/进程。它们不使用
Timeout()
生成异步函数,他们用它来模拟一个需要时间来执行的动作,从而演示异步实际上是如何工作的。你可以通过在每次迭代(或迭代块)之间执行
setTimeout
,来编写一个异步循环。好吧,我想我的问题应该是如何编写多线程代码?@waterchiller编辑以包括这一点。好的,非常感谢。这就是setTimeOut和网络调用的基本功能?@waterchiller是的,有点,只是在另一个线程中运行的代码不是JavaScript,而是一些编译过的东西,也可以直接利用硬件。好的,谢谢,看起来有点复杂。在swift中进行多线程处理要容易得多