Day11-同步&&非同步

前言

非同步函式与同步函式是非常多人所误解

  1. 同步(Synchronous)函式为逐行运作,当A没完成B会傻傻地等
  2. 非同步(Asynchronous)函式为避免程序阻塞,影响到使用体验等等,若A需要时间,会继续执行B,并且若A完成便会呼叫执行A。

先来看一下同步

console.log('1')
console.log('2')

这样就是了?

这跟平常JavaScript有什麽两样???

没错!!! JavaScript其实只有一条主程序(single thread),所以很容易会阻塞。

而当我们要去获取外部的资料,举例: 我要去中央气象局透过api拿温度资料。

我们的步骤如下:

  1. 透过呼叫非同步函式(ajax) 去中央气象局帮我拿取资料
  2. 在资料没拿回来之前,我先去执行剩余的程序
  3. 非同步函式说他OK了(资料回传成功)
  4. 主程序再呼叫非同步函式继续执行

更直白的说法,在餐厅中:

  1. 服务生先去帮第一组客人点餐
  2. 把点餐单传给厨房,厨房会负责制作好餐点
  3. 并且继续为下一组客人点餐
  4. 接着主厨说第一组餐点好了,这时候正在为第二组人点餐的服务生,必须快点把第二组点完,然後先去厨房把餐点递给第一组客人(也就是结单)
  5. 继续为下一组客人点餐

而JavaScript就是使用非同步的方式制造有多工的假象。

其实setTimeout就是web api(非同步函式)

function Getdata() {
  console.log('1');
  setTimeout(function() {
    console.log('2, 等我1秒');
  },1000)
  console.log('3');
}
Getdata()
/*
1
3
2 等我1秒
*/

只要用到web api,不论是否为0秒都要等待被呼叫

function Getdata() {
  console.log('1');
  setTimeout(function() {
    console.log('2, 等我0秒');
  },0)
  console.log('3');
}
Getdata()
/*
1
3
2 等我0秒
*/

明天我们会进入Promise,看Promise如何解决callback的痛点!!!

/images/emoticon/emoticon07.gif


<<:  [Day11] CH08:积沙成塔——Array & ArrayList(上)

>>:  Day 11 来吧!开始你的第一个广告活动

<Day27> 永丰金iLeader — 查询帐务

● 这章会示范如何透过永丰iLeader查询交易帐务 接续前一章,我们这章来查询股票买卖的交易纪录 ...

neat download manager 类似IDM 完全免费

IDM3.67简体破解版,最近打开就提示更新,更新后就不能用了! 然后就无意中发现了这款神器,功能上...

Day08 - [丰收款] 十六进位格式的後续探讨,字串传输容量倍增了!

延续昨天的十六进位转换,还有件重要的事。 隐藏的问题,容量变大了 若是某个需求,资料传送过程中不允许...

寝室的秘密授课(一):环境安装

「糟了!我还没有看信箱!」顶着一头蓬松乱发的诗忆匆匆的掀开被子,迅速且小心翼翼地沿着旁边的梯子往下攀...

[day27] PostBack资料data处理 显示菜单

对PostBack Event中的字串进行处理,由於这个参数仅能放入字串,所以可以套用网页Query...