异步函数这个术语有点名不副实:调用一个函数时,程序只在该函数返回之后才能继续。JavaScript写手如果称一个函数为“异步的”,其意思是这个函数会导致将来再运行另一个函数,后者取自于事件队列(若后面这个函数是作为参数传递给前者的,则称其为回调函数,简称为回调)。于是,一个取用回调的异步函数永远都能通过以下测试。 var functionHasReturned = false; asyncFunction(function() { console.assert(functionHasReturned); }); functionHasReturned = true; 异步函数还涉及另一个术语,即非阻塞。非阻塞这个词强调了异步函数的高速度:异步MySQL数据库驱动程序做一个查询可能要花上一小时,但负责发送查询请求的那个函数却能以微秒级速度返回。这对于那些需要快速处理海量请求的网站服务器来说,绝对是个福音。 通常,那些取用回调的函数都会将其作为自己的最后一个参数。(可惜的是,老资格的setTimeout和setInterval都是这一约定的特例。)不过,有些异步函数也会间接取用回调,它们会返回Promise对象或使用PubSub模式。本书稍后就会介绍这些异步设计模式。 遗憾的是,要想确认某个函数异步与否,唯一的方法就是审查其源代码。有些同步函数却拥有看起来像是异步的API,这或者是因为它们将来可能会变成异步的,又或者是因为回调这种形式能方便地返回多个参数。一旦存疑,请别指望函数就是异步的。