javascript - 为什么以及何时异步代码是非阻塞的?
问题描述
当我试图围绕异步编程进行思考时,我觉得有些东西不适合我的画面。每个 JavaScript 教程都这样说:
每次发生昂贵的操作时,我们都会传递一个回调函数,一旦我们可以继续处理,就会调用该回调函数。在继续程序的其余部分之前,我们不会等待它完成。
我怎么看,当我们执行一些命令时,我们需要这个代码的结果来下一个命令。那么,当我们在程序的其余部分需要异步调用的结果时,异步调用怎么能不阻塞执行呢?
例如这样的简单代码:
var a = 12;
var c = 0;
function sum( data ) {
console.log( data.b + a );
c = data.b + a // global c here
console.log( 'and now we can continue with next command' );
}
verySlowAndExpensiveAsyncCall( a, sum );
console.log( 'can we execute this without waiting previous to finish?' );
console.log( c );
对于我的程序思维,我觉得无论如何我都无法执行任何下一个命令,因为我需要c
继续的值。那么这里的非阻塞性质在哪里呢?
我的问题可能不是严格意义上的堆栈溢出问题,但它是理解异步编程的基础,我已经阅读了很多文档并且不知何故错过了这个重要部分:为什么以及何时(在哪些条件下)异步代码是非阻塞的?
我期望解释或解释的来源作为答案。
解决方案
推荐阅读
- magnolia - 执行操作时发生错误
- c# - 如何在 Task.WhenAll 中分配变量
- docker - 如何基于每个 pod 从 Kubernetes 向 GELF UDP 端点发送日志
- jquery - 简单回调函数未按预期工作
- .htaccess - 301重定向到错误的url
- android - 使用 Clang 作为编译器构建 Android 项目时从静态库中隐藏符号
- php - 如果某个数组中的值等于另一个数组中的值,则更改该数组中的值
- java - OracleDriver 不接受 jdbcUrl jdbc:oracle:thin@localhost:1521/orcl
- c++ - 一个类可以只继承成员的声明而没有定义吗?
- perl - 如何使用 Perl 进行 SPARQL 更新?