-->

JavaScript是同步(阻塞)或异步(非阻塞)默认(Is Javascript synchron

2019-09-02 21:55发布

我试图把握JavaScript的异步函数和回调。

我被困在回调函数,在那里我阅读一些地方的观念:他们是利用有代码(主要是在jQuery的动画如上下文)顺序执行和一些地方特别是在中的NodeJS的背景下; 它们被使用以具有并行执行异步和避免的码阻塞。

所以可以在这个主题中的一些专家,请在此阐明,并在我的脑海(例子?)清除该模糊。 所以我可以让我的脑海回调函数的用法

或者说是完全取决于你在哪里调用/放置一个回调函数在代码的地方吗?

谢谢,

PS:我很害怕,这个问题将接近主观但我仍然可以期待这(也许一些例子)具体的答案

编辑:其实这是从互联网上这点让我ambigous的例子:

function do_a(){
  // simulate a time consuming function
  setTimeout( function(){
    console.log( '`do_a`: this takes longer than `do_b`' );
  }, 1000 );
}

function do_b(){
  console.log( '`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`' );
}

do_a();
do_b();

结果

`do_b`: this is supposed to come out after `do_a` but it comes out before `do_a`
`do_a`: this takes longer than `do_b`

当JS是连续的,则do_b应该总是do_a后,根据我的理解来。

Answer 1:

的JavaScript的核心主要是同步的,在功能全面完成自己的任务,在完成之前。 对AJAX的出现之前,它真的只的setTimeout和setInterval所提供异步行为。

然而,人们很容易忘记,事件处理程序,有效地异步代码。 附加的处理程序不调用处理程序代码,直到在未来的一段时间不可知不执行该代码。

然后是AJAX,其调用服务器。 这些通话可以被配置成同步的,但开发商普遍首选异步调用和使用回调方法实现它们。

于是,我们看到JS库和工具包的泛滥。 这些力图同质化不同的浏览器的东西实现,并建立在回调方法来异步代码。 你也开始看到的东西像数组迭代或CSS查询结果处理更大量的同步回调。

现在,我们看到在混合Deferreds和承诺。 这些都是表示长时间运行的操作的价值和到达时处理该值提供了一个API对象。

倾斜的NodeJS实现异步方法很多东西; 这是非常真实。 然而,这更多的是对他们的部分设计决定的,而不是JS的任何固有的异步本性。



Answer 2:

JavaScript是总是同步(阻塞)单线程语言,但我们可以通过编程来启动JavaScript行为异步。

同步代码:

console.log('a');
console.log('b');

异步代码:

console.log('a');
setTimeout(function() {
    console.log('b');
}, 1000);
setTimeout(function() {
    console.log('c');
}, 1000);
setTimeout(function() {
    console.log('d');
}, 1000);
console.log('e');

这种输出:aebcd



Answer 3:

在节点长时间运行的进程使用process.nextTick()排队的功能/回调。 这通常是节点的API中,除非你的程序设计(API之外的)的东西,阻止或代码,长时间运行那么它并没有真正影响你多少事。 下面的链接应该更好地解释它,然后我可以。

howtonode process.nextTick()

jQuery的AJAX也需要回调和诸如它的编码不就移动到下一个代码块之前等待服务器的响应。 它只是rememebers当服务器响应运行功能。 这是基于XmlHttpRequest对象浏览器上曝光。 XHR对象将记住函数来调用回响应返回时。

setTimeout(fn, 0)的JavaScript将一次调用栈是可用于创建异步相似的特征空(下一个可用的自由蜱)运行的功能。 的setTimeout(FN,0)上计算器问题

为了summerise的JavaScript的异步能力是很多工作要做,他们是编程,如JavaScript本身的环境。 你不通过,除非你使用一些API /脚本只是使用了大量的函数调用和回调获得任何魔法。

jQuery的Deferred对象是另一个很好的链接的jQuery异步功能。 谷歌搜索会发现你对jQuery的递延作品也为更深入的信息。



文章来源: Is Javascript synchronous(blocking) or Asynchronous(nonblocking) by default