如何在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。