如何在node.js中创build自定义asynchronous函数?
我不确定node.js是如何实现asynchronous的,哪些不是,以及如何创build自定义的ansyc函数。
说我想创build一个自定义的asynchronous。 如果仅仅是因为我把最后一个参数调用到了asynchronous函数callback函数或者cb函数中,它就会知道它是一个asynchronous函数,我会感到惊讶:
function f(arg1, callback){ //do stuff with arg1 arg1.doStuff() //call callback callback(null, arg1.result()); }
我尝试了这样的事情,它不工作asynchronous。 你如何告诉node.js f实际上是asynchronous的?
要创build一个asynchronous函数,你必须有一些asynchronous原语(通常是IO相关的) – 定时器,从文件系统读取数据,发出请求等。
例如,这个函数需要一个callback参数,并在100ms之后调用它:
function async(callback) { setTimeout(function() { callback(); }, 100); }
在不需要的情况下进行asynchronous函数的一个可能的原因是API的一致性。 例如,假设您有一个函数发出networking请求,并将结果caching到以后的调用中:
var cache = null; function makeRequest(callback) { if(!cache) { makeAjax(function(result) { cache = result; callback(result); }); } else { callback(cache); } }
问题是,这个函数是不一致的:有时它是asynchronous的,有时不是。 假设你有这样的消费者:
makeRequest(function(result) { doSomethingWithResult(result); }); doSomethingElse();
doSomethingElse
函数可以在doSomethingElse
函数之前或之后运行,具体取决于结果是否被caching。 现在,如果在makeRequest
函数上使用asynchronous基元,比如process.nextTick
:
var cache = null; function makeRequest(callback) { if(!cache) { makeAjax(function(result) { cache = result; callback(result); }); } else { process.nextTick(function() callback(cache); }); } }
调用总是asynchronous的, doSomethingElse
总是在doSomethingWithResult
之前运行。
只有本地函数(可以访问事件循环)是asynchronous的。 你需要调用其中的一个来获得你的callback的asynchronous性。 请参阅什么是asynchronousJavaScript函数的简单示例? 。
如果你没有使用任何东西,几乎没有理由使你的函数asynchronous。