首页 > 解决方案 > 为什么以及何时异步代码是非阻塞的?

问题描述

当我试图围绕异步编程进行思考时,我觉得有些东西不适合我的画面。每个 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继续的值。那么这里的非阻塞性质在哪里呢?

我的问题可能不是严格意义上的堆栈溢出问题,但它是理解异步编程的基础,我已经阅读了很多文档并且不知何故错过了这个重要部分:为什么以及何时(在哪些条件下)异步代码是非阻塞的?

我期望解释或解释的来源作为答案。

标签: javascriptasynchronous

解决方案


推荐阅读