首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >缺省情况下,Javascript是同步(阻塞)还是异步(非阻塞

缺省情况下,Javascript是同步(阻塞)还是异步(非阻塞
EN

Stack Overflow用户
提问于 2013-05-13 21:56:27
回答 3查看 17.4K关注 0票数 22

我正在尝试掌握Javascript异步函数和回调。

我被回调函数的概念卡住了,我读到了一些地方:它们用于顺序执行代码(主要是在jquery的上下文中,例如animate),以及一些地方,特别是在Nodejs的上下文中;它们用于异步并行执行,避免代码阻塞。

所以能不能请一些这方面的专家来阐明这一点,并在我的脑海中清除这个模糊的东西(例子??)。所以我可以决定回调函数的用法

还是只取决于您在代码中调用/放置回调函数的位置?

谢谢,

附言:我担心这个问题会很主观,但我仍然可以期待这个问题的具体答案(也许是一些例子)

编辑:实际上这是来自互联网的例子,这让我很含糊:

代码语言:javascript
复制
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();

结果

代码语言:javascript
复制
`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之后。

EN

回答 3

Stack Overflow用户

发布于 2013-05-13 22:14:30

JavaScript的核心在很大程度上是同步的,因为函数在完成之前完全完成了它们的任务。在AJAX出现之前,实际上只有setTimeout和setInterval提供异步行为。

然而,很容易忘记事件处理程序实际上是异步代码。附加处理程序不会调用处理程序代码,该代码直到将来某个不可知的时间才会执行。

然后是AJAX,它调用服务器。这些调用可以配置为同步的,但开发人员通常更喜欢异步调用,并使用回调方法来实现它们。

然后,我们看到了JS库和工具包的激增。它们致力于使不同浏览器的实现同质化,并建立在异步代码的回调方法之上。您还开始看到更多用于数组迭代或CSS查询结果处理的同步回调。

现在,我们看到Deferreds和Promises的组合。这些对象表示长时间运行的操作的值,并提供API用于在该值到达时对其进行处理。

NodeJS倾向于在很多事情上采用异步方法;这一点是正确的。然而,这更多的是他们的设计决定,而不是JS固有的异步本质。

票数 24
EN

Stack Overflow用户

发布于 2015-05-11 04:06:33

Javascript总是一种同步(阻塞)的单线程语言,但是我们可以通过编程使Javascript异步运行。

同步代码:

代码语言:javascript
复制
console.log('a');
console.log('b');

异步代码:

代码语言:javascript
复制
console.log('a');
setTimeout(function() {
    console.log('b');
}, 1000);
setTimeout(function() {
    console.log('c');
}, 1000);
setTimeout(function() {
    console.log('d');
}, 1000);
console.log('e');

输出:a、e、b、c、d

票数 14
EN

Stack Overflow用户

发布于 2013-05-13 22:14:29

在节点长时间运行的进程中,使用process.nextTick()对函数/回调进行排队。这通常是在node的API中完成的,除非您使用阻塞或长时间运行的代码进行编程(在api之外),否则它不会对您产生太大影响。下面的链接应该比我能更好地解释它。

howtonode process.nextTick()

jQuery AJAX还接受回调,因此在进入下一段代码之前不会等待服务器响应。它只会记住当服务器响应时要运行的函数。这是基于浏览器公开的XMLHTTPRequest对象。XHR对象将记住响应返回时要回调的函数。

一旦调用堆栈为空(下一个可用的空格),javascript的setTimeout(fn, 0)将运行一个函数,该函数可用于创建类似异步的功能。setTimeout(fn, 0) question on stackoverflow

总而言之,javascript的异步能力与其编程环境和javascript本身一样重要。仅仅使用大量的函数调用和回调是不会有任何魔力的,除非你使用了一些API/脚本。

Jquery Deferred Object是jQuery异步功能的另一个很好的链接。谷歌可能会找到关于jQuery延迟工作原理的信息,也可以获得更多的洞察力。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16523870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档