And*_*ndu 5 javascript asynchronous process
尽管是单线程的,但我一直在研究 javascript 的异步行为,并且我是在评论说明此代码后才来的:
request(..., function (error, response, body)
console.log('foo);
});
callAComputationallyIntensiveSynchronousFunctionThatTakesSixHoursToExecute();
console.log('bar');
Run Code Online (Sandbox Code Playgroud)
'bar' 仍然会出现在 'foo' 之前,因为 Javascript 总是先完成当前正在执行的函数。事件永远不会中断功能。
我知道同步函数执行的优先级高于事件,但我不明白为什么 'bar' 会在 'foo' 之前打印。根据我的阅读,应该进行异步调用,然后在响应准备好之前填充死区时间,继续处理其他代码行,直到准备好,然后它应该执行响应的回调函数然后返回处理代码等等。
然而,上面的例子表明,即使响应在同步函数执行完成之前很久就准备好了,它仍然会继续执行下一行代码。这是为什么?
在 JavaScript 中,一切都是函数。同步函数和异步函数之间没有区别。唯一的区别是调用这些函数的方式。所以“同步”/“异步”对于程序员来说是一个抽象概念,这使得沟通更容易。
JavaScript 的实际工作原理:
JavaScript 有一个等待执行的“函数”队列。每次创建新的“异步函数”时,都会将其添加到此队列中。例如,当您执行setTimeout()ajax 调用或只是浏览器触发的 DOM 事件(如“onClick”)时,就会发生这种情况。
如果在 JS 中执行特定函数,它永远不会被中断 - 它会一直运行直到完成(返回)。只有之后,运行时(浏览器)才会查看队列,决定接下来应该执行哪个函数,然后调用它 - 等待它完成。
在上面的示例中,浏览器当前正在执行将打印“bar”的函数。此执行在完成之前无法中断,因此首先打印“bar”。然而,在执行期间,会创建一个新的异步函数并将其推送到执行队列。仅在打印“bar”之后,运行时才会在队列中查找,找到“foo”函数并执行它。
这样做的一个负面影响是长时间运行的任务。当执行这样的函数时,浏览器不能执行任何其他操作。甚至不渲染/更新页面。因此,如果您有一段代码运行了例如 10 秒,则在该功能完成之前用户无法与网站交互。原因是所有用户事件(例如鼠标移动、单击和滚动事件)都会排队,并且在线程完成长时间运行的任务之前无法处理。
使用 JavaScript 进行多线程处理
借助 HTML5,JavaScript 现在有机会通过Web Worker来使用多线程。但这是一个完全不同的主题,超出了这个问题的范围。请记住,这在理论上是可能的。
| 归档时间: |
|
| 查看次数: |
1458 次 |
| 最近记录: |