gpt4 book ai didi

javascript - 异步代码,它是如何工作的? promise 和回调

转载 作者:行者123 更新时间:2023-11-28 04:10:46 25 4
gpt4 key购买 nike

我试图在网上找到答案,并做到了部分。但我还是不能完全理解JS如何运行异步代码?

我对事物的看法:

JS给了我们异步编程的能力。这意味着我们可以开始第一个任务,然后当一个任务正在进行时我们可以开始第二个任务,依此类推。在 js 开始第二个任务之前,它应该从前一个任务中释放出来。可以通过两种方式实现:

  • js 自己完成任务(仅由 js 处理的代码)
  • js 可以启动应该由文件系统处理的任务。在本例中,js 执行其工作,将任务传递到文件系统并开始处理其他排队的任务。当js被释放并且文件系统返回结果时,js可以继续该任务。

所以我们不能仅通过编写下面的代码来实现异步:

function doSth( callback ) {
let arr = [];

for ( let i=1e6; i > 0; i-- )
arr.push( i );

callback();
}

doSth( console.log.bind( null, 'I am callback' );
console.log( 'just a line' );

由于doSth()只包含js的工作,所以会先完成然后只出现“只是一行”?所以它不是异步的,对吧?但是如果我们将文件系统任务插入循环,我们将拥有异步函数?

还有一个问题:Promise 真的是异步的吗?它们怎么可能是异步的(我的意思是,在 promise 处理时可以处理其他任务),或者 promise 只是模仿异步代码?*我知道, promise 还有额外的队列。

也许我只是不明白一些基础?如果您能为我解释一下,让我的问题更明确,我会很高兴。

最佳答案

我认为你说得对。

函数doSth是同步的,并且会阻塞主线程直到完成。您只提供回调 API,但这并不意味着它会神奇地变成异步。

事实是,您编写的所有 JS 代码都是同步的,除非您使用定义为异步的核心 JS 函数(例如,fs.readFilesetTimeout $.ajax({...}).done)。没有它们,你就无法创建异步行为,你必须从头开始编写自己的 JS 核心,并使用事件循环(事实上,我鼓励你谷歌并研究 javascript 事件循环 是什么,我相信它会为您澄清许多事情,并使您更好地了解核心中发生的事情)。所有第 3 方库都实现了异步行为,只是因为它们使用这些核心函数并用自己的代码包装它们,从而提供了更优雅和更高级别的 API。

这同样适用于 promise 。是的,它们是异步的,但前提是您用异步代码填充它们。事实上,它们有一些额外的开销,并且不会立即运行代码,但如果单个 Promise 仅包含同步代码,那么它的最终执行将阻塞主线程,直到完成。

关于javascript - 异步代码,它是如何工作的? promise 和回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46295492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com