Javascript中的异步性背后的东西 - 事件驱动系统

lis*_*sak 2 javascript asynchronous callback event-driven

请帮我理解这个.

你有一个函数调用几个方法:

function() {
   methodA(function(){...});
   methodB();
   methodC();
}
Run Code Online (Sandbox Code Playgroud)

从没有回调或匿名函数的语言我习惯了这样的事实,即在方法返回之前执行不会继续.

因此,如果我使用回调调用methodA,则执行必须等到方法返回时才会异步,对吧?

因此,例如,我可以将回调存储到某个对象并让methodA返回.然后执行methodB和methodC.当用户单击一个按钮时,某个处理程序会执行回调吗?

我得出的结论是,与java或python(不涉及多线程)相比,javascript没有异步....因为在java中,回调不是闭包/匿名方法,而是具有"execute"方法的对象它会完全相同,只是有点复杂......当然,这个JS事件系统特定于DOM

小智 5

JavaScript中的回调不会隐式添加异步行为.当调用回调函数,它运行的权利,然后,就像一个正常功能.(实际上,一个回调函数只是一个普通的功能...)

正因为如此,它是不可能确定何时该示例中的回调的执行将关系到其他的方法(除了它不能运行之前运行的methodA调用) -它可以从所谓的methodAmethodB或点击以后,或根本没有.(但是,除非存在异常 - 或者其中一个函数调用其他函数之一 - 然后methodA将运行之前methodB依次运行methodC;如果methodA抛出异常,则既不调用methodB也不methodC调用).

什么添加异步行为是一个异步事件源,如按钮点击一个定时器事件或UI等动作.

但是,请务必记住Javascript没有或支持线程.在触发新的异步事件之前,Javascript必须"停止"(执行必须从异步事件源调用的回调函数返回).(异步事件按[适当时]排队,因此如果另一个回调执行时间过长,则定时器事件不会"丢失".)

这就是为什么while (true) {}会使浏览器页面冻结并阻止处理按钮事件处理程序的原因.

快乐的编码.


示例案例(jsfiddle demo):

function invokeNow(callback) {
   // nothing asynchronous going on here.
   // the callback is invoked right now and the result is returned.
   return callback()
}
alert(invokeNow(function () { return "Hello world!" }))

function doLater(callback) {
    // setup an asynchronous event
    setTimeout(callback, 1000)
    return "It isn't 'later' yet!"
}

alert(doLater(function () {
    alert("Later!")
    // note that this is running in the callback from the previous
    // timer event. if this code was below the outer alert then
    // it wouldn't have allowed the first timer callback to have occurred
    // until the blocking while was complete
    alert(doLater(function () { alert("I still ran!") }))
    var end = (+new Date) + 4000
    while ((+new Date) < end) { /* wait */ }
    alert("I am done waiting")
}))
Run Code Online (Sandbox Code Playgroud)

警告:Firefox 4(4.0.1)和上面的代码似乎存在问题.虽然它的工作原理如下所示,但如果超时低于约800毫秒,则预期的顺序与实际顺序不同.我发布了SO:在Firefox 4中同步运行的异步计时器事件("buggy")?所以希望会有一些解决方案.该行为在Firefox 3,IE 9和Chrome 11中按预期工作.