我正在尝试掌握Javascript异步函数和回调。
我被回调函数的概念卡住了,我读到了一些地方:它们用于顺序执行代码(主要是在jquery的上下文中,例如animate),以及一些地方,特别是在Nodejs的上下文中;它们用于异步并行执行,避免代码阻塞。
所以能不能请一些这方面的专家来阐明这一点,并在我的脑海中清除这个模糊的东西(例子??)。所以我可以决定回调函数的用法
还是只取决于您在代码中调用/放置回调函数的位置?
谢谢,
附言:我担心这个问题会很主观,但我仍然可以期待这个问题的具体答案(也许是一些例子)
编辑:实际上这是来自互联网的例子,这让我很含糊:
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之后。
发布于 2013-05-13 22:14:30
JavaScript的核心在很大程度上是同步的,因为函数在完成之前完全完成了它们的任务。在AJAX出现之前,实际上只有setTimeout和setInterval提供异步行为。
然而,很容易忘记事件处理程序实际上是异步代码。附加处理程序不会调用处理程序代码,该代码直到将来某个不可知的时间才会执行。
然后是AJAX,它调用服务器。这些调用可以配置为同步的,但开发人员通常更喜欢异步调用,并使用回调方法来实现它们。
然后,我们看到了JS库和工具包的激增。它们致力于使不同浏览器的实现同质化,并建立在异步代码的回调方法之上。您还开始看到更多用于数组迭代或CSS查询结果处理的同步回调。
现在,我们看到Deferreds和Promises的组合。这些对象表示长时间运行的操作的值,并提供API用于在该值到达时对其进行处理。
NodeJS倾向于在很多事情上采用异步方法;这一点是正确的。然而,这更多的是他们的设计决定,而不是JS固有的异步本质。
发布于 2015-05-11 04:06:33
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');
输出:a、e、b、c、d
发布于 2013-05-13 22:14:29
在节点长时间运行的进程中,使用process.nextTick()
对函数/回调进行排队。这通常是在node的API中完成的,除非您使用阻塞或长时间运行的代码进行编程(在api之外),否则它不会对您产生太大影响。下面的链接应该比我能更好地解释它。
jQuery AJAX还接受回调,因此在进入下一段代码之前不会等待服务器响应。它只会记住当服务器响应时要运行的函数。这是基于浏览器公开的XMLHTTPRequest对象。XHR对象将记住响应返回时要回调的函数。
一旦调用堆栈为空(下一个可用的空格),javascript的setTimeout(fn, 0)
将运行一个函数,该函数可用于创建类似异步的功能。setTimeout(fn, 0) question on stackoverflow
总而言之,javascript的异步能力与其编程环境和javascript本身一样重要。仅仅使用大量的函数调用和回调是不会有任何魔力的,除非你使用了一些API/脚本。
Jquery Deferred Object是jQuery异步功能的另一个很好的链接。谷歌可能会找到关于jQuery延迟工作原理的信息,也可以获得更多的洞察力。
https://stackoverflow.com/questions/16523870
复制相似问题