JavaScript语言的执行环境是单线程的,即是一次只能完成一个任务,其他任务排队等候执行。只有当前一个任务完成时,才能开始进行下一个任务。
这种模式的执行环境简单,若是遇到一个耗时较长的任务,将会拖延整个程序的执行。
为了解决这个问题,我们有同步和异步两种任务的执行模式:
同步模式即上述所说的单线程模式;
异步模式:每个任务都有回调函数(callback),
前一个任务结束后,不是执行后一个任务,而是执行回调函数,
后一个任务则是不等前一个任务结束就执行,
所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
小剧场:
顾客1(打电话):
老板,我要买本小黄书,你有吗?
老板:
我找找,一会儿给你回电话。( 老板干其他事情。)
顾客2(打电话):
老板,我要买本红包书,你有吗?
老板:
我找找,一会儿给你回电话。( 老板干其他事情。)
…………
找到书,老板回电话。
剧场说明
其中回电话就是我们的回调函数,而找书就是任务。
异步:
找到书(前一个任务完成)就回电话(执行回调函数),
而后一个任务(找书)不管前一个任务是否完成都会开始。
同步:
老板接了电话就开始找书(保持通话状态),
直到书找到满足顾客1的需求,
顾客2的电话才能打得进来。
回调函数:
回调函数是实现异步编程的最基本的方法。我们假设有两个函数f1()和f2(),f1()执行完成后才能执行f2():
f1();
f2();
假设f1()是一个很耗时的任务,那么我们可以考虑异步机制,改写f1(),将f2改写为f1()的回调函数:
function f1 (callback) {
setTimeout(function () {
callback()},1000);
}
f1(f2);
采用这种方式,我们把同步操作变成了异步操作,f1不会堵塞程序的运行,也就是说我们先执行程序的主要逻辑,将耗时的操作推迟执行。
欢迎讨论和指出不足^_^
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。