gpt4 book ai didi

javascript - Javascript 异步性的背后是什么 - 事件驱动系统

转载 作者:行者123 更新时间:2023-11-29 16:26:04 25 4
gpt4 key购买 nike

请帮助我理解这一点。

您有一个调用一些方法的函数:

function() {
methodA(function(){...});
methodB();
methodC();
}

对于没有回调或匿名函数的语言,我已经习惯了这样一个事实:在方法返回之前,执行不会继续。

因此,如果我使用回调调用 methodA,则执行必须等到该方法返回,这不会是异步的,对吗?

这样,例如,我可以将回调存储到某个对象并让 methodA 返回。然后执行方法B和方法C。当用户单击按钮时,某些处理程序会执行回调?

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

最佳答案

JavaScript 中的回调不会隐式添加异步行为。当调用回调函数时,它会立即运行,就像普通函数一样。 (实际上,回调函数只是一个普通的函数......)

因此,不可能确定示例中回调的执行与其他方法的关系何时运行(除非它不能在 methodA< 之前运行)/code> 被调用)——它可以从 methodAmethodB 调用,或者稍后单击,或者根本不调用。 (但是,除非出现异常,或者其中一个函数调用其他函数之一,否则 methodA 将在 methodB 之前运行,而 methodB 又会在 methodB 之前运行code>methodC;如果 methodA 抛出异常,则 methodBmethodC 都不会被调用)。

添加异步行为的异步事件源,例如计时器事件或 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")
}))

警告:Firefox 4 (4.0.1) 和上面的代码似乎存在问题。虽然其工作原理如演示的那样,但如果超时低于约 800 毫秒,则预期顺序与实际顺序不同。我已发布SO: Asynchronous timer event running synchronously (“buggy”) in Firefox 4?所以希望会有一些解决方案。该行为在 Firefox 3、IE 9 和 Chrome 11 中按预期工作。

关于javascript - Javascript 异步性的背后是什么 - 事件驱动系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com