Javascript 关于同步性/异步性假设的最佳实践

Javascript 关于同步性/异步性假设的最佳实践,javascript,node.js,Javascript,Node.js,我有两个关于同一主题的问题,取决于视角 假设有一个函数接受一个回调,该回调接收已执行函数的返回值: function myFunction( callback ) { //do something callback( something ); } myFunction( function( something ) { console.log( 'a' ); } ); console.log( 'b' ); 现在有人调用此函数: function myFunction

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

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

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

console.log( 'b' );
现在有人调用此函数:

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

console.log( 'b' );
我的观点是: 用户(调用函数的用户)对事件“a”和“b”的顺序进行假设时,是否总是节省时间?结果:依赖于确切的行为是否被认为是糟糕的编码风格?(不是说运行时间,而是关于同步性或异步性!)有人可能会认为
myFunction
是异步的,因此“b”必须总是出现在“a”之前

反过来说: 作为设计某个函数的人,没有可预测的顺序会被认为是糟糕的编码风格吗?可能需要等待某个事件发生,从而产生异步响应,或者可能不需要等待这个确切的操作,因此不需要异步性。 在这种情况下,最好添加一个process.nextTick(…)以始终具有相同的行为


提前谢谢

通常,您应该编写代码,这样就无所谓了。但是,在某些情况下,必须延迟发出事件,例如,如果某个东西在构造函数中发出自身的事件,那么此时您无法侦听它。

如果开发人员希望安全,在使用myFunction之前,他们应该了解myFunction的行为。这是一个非常圆滑的回答:)对于该函数的设计者,会发生什么情况?…根据下面的评论,创建一个用户无法预测其行为的函数是不明智的。如果您可以通过使特定情况同步运行来优化它,那么您可能仍然应该将其记录为需要回调的异步函数。当它最终是同步的时,您仍然可以在准备就绪时启动回调。是的,我明白您的意思,在构造函数中的事件中,程序员必须确保它被延迟。但是,当有人调用一个函数时,这一次不需要(没有IO,FS访问…)使其异步运行,而在另一种情况下则是必需的,这是什么情况呢?@zaphod1984:假设它可能会立即回调,除非模块文档或其代码另有说明。通常情况下,它不会使您的代码更复杂,那么为什么不呢?回到您的示例,我提出了一个要点:我没有编造这个,我正好遇到了这个问题,正是这个问题导致了我提出这个问题。如果
someAsynchrounosFunction
的行为不符合预期,那么该代码将无法工作。