Javascript异步执行机制
有人能解释一下javascript异步行为背后的机制吗,特别是当涉及到.subscribe()时,或者提供一个链接来帮助我理解引擎盖下到底发生了什么 一切看起来都是单线程的,然后我遇到了多线程或多线程的情况,因为我仍然无法摆脱被愚弄的感觉 在我调用.subscribe()之前,每一条指令似乎都完全同步运行。然后,突然发生了一些事情——它立即返回,并且不知何故,下一个外部函数运行,即使订阅代码尚未运行。对我来说,这感觉是异步的,浏览器如何保持事情的直线性?如果不是线程,有人能解释一下允许这种情况发生的机制吗Javascript异步执行机制,javascript,ecmascript-6,rxjs,Javascript,Ecmascript 6,Rxjs,有人能解释一下javascript异步行为背后的机制吗,特别是当涉及到.subscribe()时,或者提供一个链接来帮助我理解引擎盖下到底发生了什么 一切看起来都是单线程的,然后我遇到了多线程或多线程的情况,因为我仍然无法摆脱被愚弄的感觉 在我调用.subscribe()之前,每一条指令似乎都完全同步运行。然后,突然发生了一些事情——它立即返回,并且不知何故,下一个外部函数运行,即使订阅代码尚未运行。对我来说,这感觉是异步的,浏览器如何保持事情的直线性?如果不是线程,有人能解释一下允许这种情况发
我还注意到调试单步执行时发生了一些事情,我不能单步执行回调,我只能在回调中放置一个断点。我应该以什么样的顺序期望事情发生?在“JavaScript事件循环”中搜索文章或视频。你会发现很多。可能会经历其中的一些,它将开始有意义(特别是它的单线程方面) 我通过快速搜索找到了这个,它做了一个很好的高级演练 JavaScript单线程的主要影响是,在另一个线程上执行代码时,您的代码不会被预先中断 看起来有些代码被跳过了,但仔细观察语法会发现,被“跳过”的只是一个回调函数或闭包,在将来某个时候调用(当它被放入事件队列并以单线程方式处理时) 小心,遵循嵌套回调可能很棘手
可能还会研究Promises和async/await(“只是事件循环的语法方便,但确实有助于代码的可读性”)您的Javascript本身运行单线程,除非您谈论的是WebWorkers(在浏览器中)或WorkerThreads(在nodejs中) 但是,在Javascript中调用的许多函数或启动的操作可以与Javascript的单线程特性分开运行。例如,网络都是非阻塞和异步的。这意味着,当您在nodejs的
http.get()
浏览器中调用fetch()
时,您正在启动一个http请求,然后发出该请求和接收响应的机制独立于Javascript完成。以下是一些示例步骤:
fetch()
,向其他主机发出http请求fetch()
调用将立即执行代码行中的所有内容)fetch()
调用的响应返回网络接口独立于Javascript的单个线程,它可以看到有从http响应读取的传入数据。当该代码收集了http响应时,它会将一个事件插入Javascript事件队列fetch()完成的事件
调用,将有一个回调函数与该事件关联。它将调用该回调函数,该回调函数将解析与fetch()
调用关联的承诺,该调用将在中生成您自己的Javascript。然后()
handler,用于运行该承诺,您的Javascript将显示您等待的http响应console.log("starting...");
fetch(host1).then(result1 => { console.log(result1)});
fetch(host2).then(result2 => { console.log(result2)});
fetch(host3).then(result3 => { console.log(result3)});
fetch(host4).then(result4 => { console.log(result4)});
console.log("everything running...");
starting...
everything running...
result1
result2
result3
result4