我不确定node.js如何能够实现异步哪些功能以及哪些功能不存在以及如何创建自定义异步功能。
说我想创建一个自定义异步函数。如果仅仅因为我调用异步函数回调或cb的最后一个参数它会知道它的异步函数,我会感到惊讶:
function f(arg1, callback){
//do stuff with arg1
arg1.doStuff()
//call callback
callback(null, arg1.result());
}
我尝试了类似的东西,它没有异步工作。你怎么告诉node.js f实际上是异步的?
答案 0 :(得分:11)
要创建异步函数,您必须在其上有一些异步原语(通常与IO相关) - 计时器,从文件系统读取,发出请求等。
例如,此函数接受一个回调参数,并在以下100ms后调用它:
function async(callback) {
setTimeout(function() {
callback();
}, 100);
}
在不需要时使函数异步的可能原因是API一致性。例如,假设您有一个发出网络请求的函数,并将结果缓存以供以后调用:
var cache = null;
function makeRequest(callback) {
if(!cache) {
makeAjax(function(result) {
cache = result;
callback(result);
});
} else {
callback(cache);
}
}
问题是,这个函数是不一致的:有时它是异步的,有时它不是。假设您有这样的消费者:
makeRequest(function(result) { doSomethingWithResult(result); });
doSomethingElse();
doSomethingElse
函数可以在doSomethingWithResult
函数之前或之后运行,具体取决于结果是否被缓存。现在,如果您在makeRequest
函数上使用异步原语,例如process.nextTick
:
var cache = null;
function makeRequest(callback) {
if(!cache) {
makeAjax(function(result) {
cache = result;
callback(result);
});
} else {
process.nextTick(function() callback(cache); });
}
}
呼叫始终是异步的,doSomethingElse
始终在doSomethingWithResult
之前运行。
答案 1 :(得分:4)
只有本机函数(可以访问事件循环)是异步的。您需要调用其中一个来获得回调的异步性。请参阅What is a simple example of an asynchronous javascript function?。
如果你没有使用任何东西,几乎没有理由让你的函数异步。