什么是同步和异步
说到烧水,我们都是通过热水壶来烧水的。在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开。随着科技的发展,现在市面上的水壶都有了提醒功能,当我们把水壶插电之后,水壶水烧开之后会通过声音提醒我们水开了。对于烧水这件事儿来说,传统水壶的烧水就是同步的,高科技水壶的烧水就是异步的。
- 同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。
- 异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。
- 所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”的结果。而异步则是相反,"调用"在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在"调用"发出后,"被调用者"通过状态、通知来通知调用者,或通过回调函数处理这个调用。
什么是阻塞和非阻塞
还是那个烧水的例子,当你把水放到水壶里面,按下开关后,你可以坐在水壶前面,别的事情什么都不做,一直等着水烧好。你还可以先去客厅看电视,等着水开就好了。对于你来说,坐在水壶前面等就是阻塞的,去客厅看电视等着水开就是非阻塞的。
- 阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。
- 非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。
阻塞、非阻塞和同步、异步的区别
其实乍一看,同步和阻塞不是一样的吗?异步和非阻塞不是一样的吗?
- 阻塞、非阻塞说的是调用者,同步、异步说的是被调用者。
- 阻塞和非阻塞指的是在等待/不等待的人本身。
- 同步和异步指的是水壶本身。
同步场景中包含阻塞和非阻塞
在这篇文章中,同步代表着传统的水壶。
- 在同步的情况下阻塞,即在水烧开之前我们一直坐在水壶前面,等着水开。
- 在同步的情况下非阻塞。在水烧开之前我们先去客厅看电视了,但是水壶不会主动通知我们,需要我们时不时的去厨房看一下水有没有烧开。
异步场景中包含阻塞和非阻塞
异步代表着的是高科技水壶。
- 在异步的情况下阻塞。在水烧发出提醒之前我们一直坐在水壶前面,等着水开。
- 在异步的情况下非阻塞。在水烧发出提醒之前我们先去客厅看电视了,等水壶发出声音提醒我们。
前端使用异步的场景有哪些?
- 定时任务:setTimeout,setInterval
- 网络请求:ajax请求,动态<img>加载
- 事件绑定
一个异步的例子/var let
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
for (let i = 0; i <= 5; i++) {
setTimeout(function() {
console.log( i );
}, i*1000);
console.log( ' i : ' , i );
}
// console.log( i );
// var let 互换
</script>
</body>
</html>
网友评论