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