我不确定node.js是如何能够实现异步的哪些功能,哪些不是以及如何创建自定义异步功能.
说我想创建一个自定义异步函数.如果仅仅因为我调用异步函数回调或cb的最后一个参数它会知道它的异步函数,我会感到惊讶:
function f(arg1, callback){ //do stuff with arg1 arg1.doStuff() //call callback callback(null, arg1.result()); }
我尝试了类似的东西,它没有异步工作.你怎么告诉node.js f实际上是异步的?
要创建异步函数,您必须在其上有一些异步原语(通常与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();
该async function
函数可以在函数之前或之后doSomethingElse
运行,具体取决于结果是否被缓存.现在,如果在doSomethingWithResult
函数上使用异步原语,例如makeRequest
:
var cache = null; function makeRequest(callback) { if(!cache) { makeAjax(result => { cache = result; callback(result); }); } else { process.nextTick(() => callback(cache)); } }
该呼叫始终是异步的,并且process.nextTick
始终在之前运行doSomethingElse
.