Nodejs如何知道是同步还是异步
我明白回调是什么以及异步意味着什么,我没有得到的是如何在节点中运行异步功能。Nodejs如何知道是同步还是异步
例如,这是怎么
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);
不同?
我想在第一个例子中,我正在异步做它,但我不知道节点如何知道什么时候做同步或异步...是否是返回的问题?或者在同步模式下我们正在做的事实var x = func(data);
?
还有:何时使用同步或异步?因为显然你不想在添加+1时使用它......只是在执行IO任务时才使用异步,比如从DB读取数据?
例如,我正在使用库加密来加密一个短字符串(最多50个字符),这是一个很好的例子,我应该已经在使用异步了吗?
我想在第一个例子中,我以异步方式做...
你的第一个例子是不是异步:)只是一个传递的回调并调用它,当你做了没有按”使一个功能异步。
异步意味着,基本上,你告诉节点:“在这里,为我做这件事,并让我知道你什么时候完成,而我继续做其他的东西”。
你的例子并没有把任何东西交给Node来完成。它正在进行计算并在此之后立即调用回调。这与您的第二个示例在功能上相同,其中返回计算结果。
但是,您可以在第一个例子改变的东西,是异步:
var action = (function(data,callback) {
setTimeout(function() {
result = data + 1;
callback(result);
}, 1000);
});
在这里,你告诉节点延迟调用回调1秒,使用setTimeout
。同时,Node不会等待一秒钟;它会高兴地接受更多的HTTP请求,并且在响应发送之前每个请求都会延迟一秒。
何时使用同步或异步?
异步代码为“病毒性”:如果你依靠可异步功能,即使用这些功能,你自己的代码也必须是异步(一般通过接受回调,或使用其他机制来处理异步,就像承诺一样)。
例如,我正在使用库加密来加密一个短字符串(最多50个字符),这种情况是一个很好的例子,我应该已经在使用异步了吗?
这取决于您正在使用的功能。 AFAIK,crypto
中的大多数加密函数都不是异步的,所以你不能让它们自己异步。
这两个示例都将同步工作。简单的异步操作是setTimout和setInterval。
节点实际上并不关心你在运行什么代码。您可以区块与否(blocking/non-blocking)。
换句话说 - 你有event loop。如果你的进程是异步的,他会将程序控制传递给事件循环,因此它可以执行任何其他需要完成的动作节点。如果没有 - 他不会。
好的,那么我完全误解了所有的东西......假设我有一个函数做了几件事情,我希望它在'后面'运行,这样它就不会阻塞主循环,一旦完成,我想要运行回调操作。那我该怎么办?用0ms设置超时? –
@CarlosNavarro可能['setImmediate'](https://nodejs.org/api/timers.html#timers_setimmediate_callback_arg)。但是,您应该意识到使用它不会奇迹般地让您的代码不会阻止事件循环。最后,JS是单线程的,所以它一次只能“做”一件事。 – robertklep