一个函数的作用是完成某一部分的任务,
一个十分耗时的任务,可以让程序等待这个任务执行完成,获得返回值然后程序继续执行,这种叫做同步执行。也可让后台默默的先接收下这个任务,当前的程序继续往下执行,等后台执行完成这个任务,通过某种方式把处理结果发送给当前的程序,这种叫做异步执行。通信的方式可以是信号量,事件,回调,轮询等。比如一个 Ajax
任务需要 10s 钟:
var data = syncAjax(URL); // 同步Ajax
console.log('sync return !');
asyncAjax(URL/*其他必要的参数,暂略*/);
console.log('async return !')
同步的方式执行syncAjax
直到 10s 之后这句才会执行完成,把 Ajax 的数据赋值给data
。所以10s 之后才会执行 console.log('sync return !');
。这种方式在 JS 不太好,因为JS是单线程,一直在这里等待 10s ,那么将会后很长时间整个浏览器没有响应,所以不可取。当然 nodejs 里面也提供了很多同步的函数。
对于异步执行的asyncAjax
,这一句立即执行完毕,所以会立即输出console.log('async return !')
,可是由于Ajax 还没有完成,所以不能把ajax 的数据返回给当前执行的程序(因为系统还没有获得服务器发送回来的值)。等到服务器返回数据了,需要用某种方式通知当前的程序,回调函数就是一种。比如
function processData(data){}
asyncAjax(URL,processData);
console.log('async return !')
当后台获得Ajax的数据gdata
,系统调用回调函数processData
,其中第一个参数是服务器返回的数据data
,这样当前的程序就可以通过processData
处理 ajax 返回的数据了。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…