【问题标题】:Best practices on assumptions of Synchronicity/Asynchronicity同步/异步假设的最佳实践
【发布时间】:2012-02-14 18:55:48
【问题描述】:

我有两个关于同一主题的问题取决于视角。

假设有一个函数接受一个回调,该回调接收执行函数的返回值:

function myFunction( callback ) {
    //do something
    callback( something );
}

现在有人调用了这个函数:

myFunction( function( something ) {
    console.log( 'a' );
} );

console.log( 'b' );

我的观点是: 是否总是让用户(调用函数的用户)对事件“a”和“b”的顺序做出假设?结果:依赖确切的行为是否被认为是糟糕的编码风格? (不是在谈论运行时间,而是在谈论同步性或异步性!)有人可能认为myFunction 是异步的,因此“b”必须总是在“a”之前发生。

反过来: 作为设计某个功能的人,没有可预测的顺序是否被认为是不好的编码风格?也许有必要等待某个事件发生,从而导致异步应答,或者可能不需要等待这个确切的动作,因此不需要异步性。 在这种情况下,最好添加一个 process.nextTick(...) 以始终具有相同的行为吗?

提前致谢!

【问题讨论】:

  • 如果开发者想要安全,他们应该在使用之前了解myFunction 的行为方式。
  • 这是一个非常圆滑的答案 :) 该功能的设计者会怎样?
  • ...回应您在下面的评论,创建一个用户无法预测其行为的函数是不明智的。如果您可以通过使其行为同步来优化特定情况,您可能仍应将其记录为需要回调的异步函数。当它最终同步时,您仍然可以在准备好时触发回调。

标签: javascript node.js


【解决方案1】:

通常,您应该编写代码以使其无关紧要。但是,在某些情况下必须延迟发射事件,例如,如果某个东西在构造函数中自己发射了一个事件 - 那时你不可能已经监听它。

【讨论】:

  • 是的,我明白你的意思,对于构造函数中的事件,程序员必须确保它被延迟。但是当有人调用一个函数并且 这一次 没有必要(没有 IO、FS 访问...)来使其异步时会发生什么情况,而在另一种情况下它 有必要吗?
  • @zaphod1984:假设它可能会立即回调,除非模块文档或其代码另有说明。通常,它不会使您的代码更复杂,为什么不呢?
  • 回到你的例子,我提出了一个要点:gist.github.com/1834492 我没有编造这个,我恰好遇到了这个问题,是什么导致我提出这个问题。如果someAsynchrounosFunction 不会像预期的那样表现异步,那么该代码不起作用。
猜你喜欢
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2013-02-02
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
相关资源
最近更新 更多