【问题标题】:Too many callbacks issue太多回调问题
【发布时间】:2014-08-17 17:13:55
【问题描述】:

我知道在 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 吗?

【问题讨论】:

  • ... 使本质上即时的方法调用异步有什么意义?
  • 我真的不知道什么时候应用async 样式。所以我只是到处使用它。
  • 只有当底层活动是真正的异步时,异步风格才有意义。如果底层活动是同步的,那么使用异步样式就没有意义,因为它只会让你的代码比它需要的更复杂。获取当前时间显然是一个同步操作。没有理由让它异步。
  • @user3925697 这是个坏主意。只有当某些东西实际上可以以有意义的方式阻塞时,您才应该使用异步。不过,您试图弄清楚这一点很好;盲目地做事往往会导致恐惧。

标签: node.js asynchronous


【解决方案1】:

如果被调用的方法可以阻塞很长时间等待 IO,则必须使用异步样式。由于 node.js 事件循环是单线程的,因此您希望在 IO 期间屈服于事件循环。如果您不这样做,则每个时间点可能只有一个未完成的 IO。这将导致完全不可扩展。

对 CPU 工作使用回调没有任何作用。它不会解除阻塞事件循环。事实上,对于 CPU 工作,不可能解除对事件循环的阻塞。 CPU 必须被占用一定的时间,这是不可避免的。 (这里不考虑网络工作者之类的东西)。

回调没有什么好处。当您必须时使用它们。它们是 node.js 事件循环 IO 模型的必然结果。

也就是说,如果您以后计划将 IO 引入now,即使并非绝对必要,您也可能会急切地使用回调样式。稍后从同步调用更改为基于回调的调用可能会很耗时,因为回调风格是病毒式的。

【讨论】:

    【解决方案2】:

    通过向函数的签名添加回调,代码会传达此函数中可能发生的异步事件,并且该函数将使用错误和/或结果对象调用回调。

    如果函数不执行任何异步操作并且不涉及可能发生(非编程)错误的条件,请不要使用回调函数签名,而只需返回计算结果。

    调用者处理带有回调的函数不是很方便,所以在你真正需要它们之前避免回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多