注意 :此答案写于2014年,在出现之前
asyncfunction,在Promises流行之前。尽管同样的原则同样适用,但我建议您先阅读Promises,然后再尝试了解它们与“传统”回调驱动的异步函数的关系。
要创建一个异步调用其回调的函数,您必须在其上使用一些平台提供的异步原语(通常与IO相关)-计时器,从文件系统读取,发出请求等。
例如,此函数采用一个回调参数,并在100ms之后调用它:
function asyncFn(callback) { setTimeout(() => { callback(); }, 100);}使API不需要时使函数异步的可能原因是。例如,假设您有一个发出网络请求并缓存结果供以后调用的函数:
var cache = null;function makeRequest(callback) { if (!cache) { makeAjax(result => { cache = result; callback(result); }); } else { callback(cache); }}问题是,此功能不一致:有时它是异步的,有时不是。假设您有一个这样的消费者:
makeRequest(result => doSomethingWithResult(result));doSomethingElse();
该
doSomethingElse函数可以在该函数之前或之后
doSomethingWithResult运行,具体取决于结果是否已缓存。现在,如果您在
makeRequest函数上使用异步原语,例如
process.nextTick:
var cache = null;function makeRequest(callback) { if(!cache) { makeAjax(result => { cache = result; callback(result); }); } else { process.nextTick(() => callback(cache)); }}该调用始终是异步的,并且
doSomethingElse始终在之前运行
doSomethingWithResult。



