使用JavaScript异步编程

Tavish Aggarwal.

J
Avascript是一种单线程语言(单呼叫堆栈)。那么它是如何异步的?我们大多数人都有同样的想法,对吗?在这篇文章中,我会向您解释我们如何在JavaScript中编写异步代码。但在进入这一点之前,让我们首先看到同步和异步之间的区别。

同步和异步之间的差异

甜巧简单的方式来解释差异是当我们有两行代码时,即L1和L2,其中L2未执行,直到执行L1。这称为同步编程,反之亦然称为异步编程。

让我用榜样解释:

L1: console.log('a同步编程');

L2: console.log('JavaScript');

控制台的输出:

a同步编程

JavaScript

正如我们所看到的,L1线将始终首先执行,然后首先执行L2代码行。这就是我们所说的 同步编程.

让我们看到另一个例子:

L1: setTimeout(function() { console.log("a同步编程"); }, 0);

L2: console.log('JavaScript');

控制台的输出:

javascript.

a同步编程

使困惑!它是因为SetTimeout是JavaScript中的异步函数。这就是我们将在这篇文章中查找的内容,并将了解异步代码如何工作。

让我们开始吧。

为什么我们需要异步编程?

如果JavaScript没有异步方法,让我们看看会发生什么。请参阅下面显示的代码:

var foo = getasyn('/getFoo');

var bar = getasyn('/getBar');

console.log('JavaScript');

console.log(foo);

console.log(bar);

现在让我们忘记异步编程,并查看在以同步方式运行的情况下,对代码的行为是如何行事的。

首先,FOO将进一步执行并将阻止执行代码(也将阻止浏览器和用户无法执行任何操作)直到接收到时间响应,下一个栏将获得执行,并将再次阻止代码的执行,直到时间响应进一步缩短代码收到了。然后最后将执行Console.log语句。 

令人沮丧!!!浏览器被阻止的原因,我们不能做任何事情都是因为呼叫堆栈有它的东西,并且在时间呼叫堆栈未清除我们不能在浏览器中执行任何操作。

这就是我们在JavaScript中需要异步方法的原因。

在进一步潜水之前,让我在这篇文章中使用这个术语时,请简要介绍V8引擎。

V8发动机

V8 JavaScript引擎是由Google Chrome Web浏览器的铬项目开发的开源JavaScript引擎。 V8将JavaScript代码转换为更高效的机器代码而不是使用解释器。 

javascript.可以通过帮助执行异步编程 Web API..

在JavaScript中执行异步编程所涉及的组件是:

  1. Webapis.
  2. 事件循环
  3. 回调队列

有很多JavaScript功能,具有异步行为,如:

  1. 索取
  2. 回调函数
  3. 获取API和更多。

现在让我们在细节中看到这一点,看看异步编程如何工作。我将在SetTimeout函数的帮助下展示。

不要担心如果它不是100%清晰,在这段时间内就有一个想法。我稍后会在视觉上展示。

在堆中存储JavaScript中的数据是否正确是正确的?不。因为JavaScript遵循ECMAScript标准,因此内存存储没有任何布局。所以它的V8(在Chrome浏览器上)或具有存储数据的能力的其他引擎。是的,在V8中,变量存储在堆中。

堆栈或呼叫堆栈

即将执行的代码将被推在堆栈上,一旦执行它将弹出堆栈。

如果功能(F1)调用,则其他功能(F2)将被推在F1顶部。一旦执行F2,就会弹出它,后跟执行完成时F1。

好的!你可能听说过堆栈溢出并想知道它是什么。让我在一个例子的帮助下向您展示:

function asyncProgram() {

         asyncProgram();

}

asyncProgram();

堆栈溢出在JavaScript中

从图表中很清楚,因为异步分流()函数调用自身,一个点来到堆栈中没有容量并且堆栈溢出发生。

Webapis.

正如我们所知,JavaScript一次只能做一个任务,并且所有代码都被推到堆栈并在执行时弹出。

WebApis帮助我们实现异步行为。 

一旦堆栈看到堆栈上的一些异步呼叫,它将发送到WebAPIS并进行执行剩余代码,一旦WebAPI解决了异步调用它,某种神奇地从异步调用堆栈返回响应并且它被执行。

回调队列

一旦WebAPI解决了响应,它将它发送到回调队列,原因是它不能只需将其发送到调用堆栈,因为它将中断运行代码的执行。

事件循环

我在上面的角度(webapis)的魔术是事件循环。它的责任只是为了监视回调队列和呼叫堆栈。一旦看到呼叫堆栈是空的并且在回调队列中有一些东西,它将从回调队列中排队请求以队列方式调用堆栈(首先第一次服务)。

我们中的一些人也有疑问(函数(){},0);没有立即执行。原因清晰现在,因为调用堆栈将推动它到WebAPI和WebAPI到回调队列。现在回调队列将等到时间堆栈不为空。执行所有代码后,堆栈将变为空。

要在视觉上了解它,存在堆栈,事件循环,回调和队列如何相互交互的视觉表示。请按照链接: http://latentflip.com/loupe 它将展示现场后面发生的事情来实现异步编程。

在即将到来的博客中,我将分享更多关于JavaScript的信息,因此不要忘记订阅最新的更新。 

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。