2012-02-14 93 views
0

我有两个关于相同主题依赖视角的问题。关于同步性/异步性假设的最佳实践

让我们假设有一个接受接收执行函数的返回值的回调函数:

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

现在有人调用这个函数:

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

console.log('b'); 

我的观点是: 是它总是为用户(调用函数的用户)保存以便对事件'a'和'b'的顺序进行假设?结果:依赖于确切的行为被认为是糟糕的编码风格吗? (不是谈论runnig时间,而是关于同步性或异步性!)有人可能会认为myFunction是异步的,因此'b'在'a'之前必须发生总是

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

在此先感谢!

+7

如果开发者想要安全,他们应该在使用之前了解'myFunction'的行为方式。 – 2012-02-14 18:58:17

+0

这是一个非常外交的回答:)在那个函数的设计者的情况下是什么? – zaphod1984 2012-02-14 19:24:01

+0

...对下面的评论作出回应,在用户无法预测其行为的情况下创建一个函数并不明智。如果您可以通过使其同步行为来优化某个特定情况,那么您应该将其记录为需要回调的异步函数。当它结束同步时,您仍然可以在准备就绪时触发回调。 – 2012-02-14 19:37:41

回答

1

通常,你应该编码,以便它没有关系。但是,有些情况下必须延迟发射事件,例如,如果某些事件在构造函数中发射了一个事件 - 当时您无法听到它。

+0

是的,我明白你的观点,在构造函数中,程序员必须确保它被延迟。但有人在调用函数时会发生什么情况?这次*它不是必需的(没有IO,FS访问......)使它成为异步,而在另一种情况下它*是必需的? – zaphod1984 2012-02-14 19:21:50

+0

@ zaphod1984:假设它可能会立即回调,除非模块文档或其代码另有说明。通常情况下,它不会让你的代码更复杂,为什么不呢? – thejh 2012-02-14 19:35:45

+0

回到你的例子我做了一个要点:https://gist.github.com/1834492我没有做到这一点,我来到这个问题是什么导致我这个问题。如果'someAsynchrounosFunction'不会像预期的那样表现异步,那么这个代码不起作用。 – zaphod1984 2012-02-15 08:45:05