我知道在nodejs中建议编写异步函数。但是,我觉得不必异步编写一些非IO事件。我的代码可能不太方便。例如:
//sync
function now(){
return new Date().getTime();
}
console.log(now());
//async
function now(callback){
callback(new Date().getTime());
}
now(function(time){
console.log(time);
});
在这种情况下,sync
方法会阻止CPU吗?这非常显着,我应该使用async
代替吗?
答案 0 :(得分:8)
如果被调用的方法可以长时间等待IO,则需要异步样式。由于node.js事件循环是单线程的,因此您希望在IO期间屈服于事件循环。如果你不这样做,每个时间点只能有一个IO未完成。这将导致完全不可扩展性。
使用回调进行CPU工作无需任何操作。它不会解锁事件循环。实际上,对于CPU工作,不可能解除阻塞事件循环。 CPU必须占用一段时间,这是不可避免的。 (无视这里的网络工作者)。
回调没什么好处。当你必须时使用它们。它们是node.js事件循环IO模型的必然结果。
也就是说,如果你以后计划将IO引入now
,即使不是非常必要,你也可能急切地使用回调方式。稍后从同步调用更改为基于回调的调用可能非常耗时,因为回调样式是病毒式的。
答案 1 :(得分:0)
通过向函数的签名添加回调,代码会在此函数中传达异步可能的内容,并且函数将使用错误和/或结果对象调用回调。
如果函数没有异步,并且不涉及可能发生(非编程)错误的条件,则不使用回调函数签名,而只返回计算结果。
调用者处理回调函数不是很方便,所以在你真正需要回调之前要避免回调。