我理解回调是什么以及异步意味着什么,我没有得到的是如何在节点中运行异步函数。
例如,这是怎么回事?
var action = (function(data,callback) {
result = data+1;
callback(result);
});
http.createServer(function (req, res) {
action(5, function(r){
res.end(r.toString());
});
}).listen(80);
与此不同
var action = (function(data) {
result = data+1;
return result;
});
http.createServer(function (req, res) {
var r = action(5);
res.end(r.toString());
}).listen(80);
我想在第一个例子中我是异步进行的,但我不知道Node如何知道何时进行同步或异步...这是回归的问题吗?或者在同步模式下我们正在做var x = func(data);
?
还有:何时使用同步或异步?因为显然你不想在添加+1时使用它...是否可以在执行IO任务时使用异步,例如从DB读取?
例如,我正在使用库加密来加密一个短字符串(最多50个字符),这种情况是一个很好的例子,我应该已经使用异步吗?
答案 0 :(得分:2)
我想在第一个例子中我是异步地做...
你的第一个例子不是异步的:)只是传递一个回调并在你完成后调用它不会使函数异步。
异步意味着,基本上,你告诉Node:“在这里,为我做这件事,并在我继续做其他事情时告诉我你什么时候”。
您的示例未将任何内容交给Node以供将来完成。它正在进行计算并在此之后立即调用回调。这在功能上与您的第二个示例相同,您将返回计算结果。
但是,您可以将第一个示例更改为 异步的内容:
var action = (function(data,callback) {
setTimeout(function() {
result = data + 1;
callback(result);
}, 1000);
});
在这里,您告诉Node使用setTimeout
延迟调用回调一秒钟。与此同时,Node不会等待一秒钟;它会愉快地接受更多的HTTP请求,每个请求都会在发送响应之前延迟一秒。
何时使用同步或异步?
异步代码是“病毒式的”:如果依赖异步函数,那么使用这些函数的代码也必须是异步的(通常通过接受回调,或者使用其他机制来处理异步性,比如promises )。
例如,我正在使用库加密来加密一个短字符串(最多50个字符),这种情况是一个很好的例子,我应该已经使用异步吗?
这取决于您使用的功能。 AFAIK,crypto
中的大多数加密函数都不是异步的,所以你不能自己“异步”它们。
答案 1 :(得分:0)
两个示例都将同步工作。简单的异步操作是 setTimout 和 setInterval 。
节点实际上并不关心你运行的是什么代码。您可以阻止或不阻止(blocking/non-blocking)。
换句话说 - 你有event loop。如果您的进程是异步的,他会将程序控制传递给事件循环,因此它可以执行任何其他需要完成的操作节点。如果不是 - 他不会。
答案 2 :(得分:0)
如果您希望函数异步工作,则可以使用promises来实现,请看下面的代码:
function is_asynch(){
return new Promise((resolve,reject)=>{
resolve( here_your_synch_function() )
})
}