Node.js控制stream:callback或承诺?
我知道有很多node.js的控制stream库 。 其中一些使用callback函数(如async,asyncblock等)来实现一个asynchronous函数,其他使用promise概念 (Q,延期,期货等)。 由于长时间运行的脚本会一个接一个地执行一系列可能会失败的操作,您更喜欢哪个控制stream程?为什么? 优缺点都有什么?
优点callback:
- 很容易理解和创造。
- 效率更高一些 ,因为更less的对象被创build和垃圾回收。
- 节点select
(error,result)
在整个callback。 我build议遵循他们的论点顺序来保持一致。 (而不是说(result1, result2, result3, error)
。)
优点:
- 提供一个stream畅的界面 ,有时可以帮助缓解嵌套的callback地狱,如下所示 。 代码似乎通过链接线性stream动。然后
.then(foo).then(bar)
。然后.then(foo).then(bar)
调用。 - 一个好的promise库允许你并行地运行许多asynchronous操作,并且只有当它们全部完成时才继续。 延期库通过
map
无缝地完成了这一工作,Q已allResolved
,ES6Promise.all()
提供了Promise.all()
。 (这也可能与callback,例如使用async.parallel()
,但没有内置。) - 一个好的promise库可以让你指定一个error handling函数 ,如果任何一个排队函数失败,这个函数将被调用。 callback
if (err) return callback(err);
需要一些样板:if (err) return callback(err);
在每个callback的开始。
在堆栈底部附近使用callback是有意义的 ,代码将每秒运行多次。 更高的堆栈,承诺可能是可取的,因为它们更容易阅读和理解,并可以更加优雅地处理错误。
值得注意的是promise可以在运行时从callback中build立 。 所以你可以在最低限度的callbackforms中实现你的核心代码,如果你愿意,还可以暴露一个promise的版本。 (如在Q.nfbind()
)
我会有兴趣听到其他利弊。
奖金提示: 总是处理错误! 使用这两种方法,如果你不处理错误,那么它将简单地消失,让你在黑暗中为什么你的代码没有按预期工作。
if (err) ...
和.catch()
总是有一个.catch()
如果它们不返回的话if (err) ...
callback应该总是处理。即使您有时会期望错误,并且不需要处理这些错误,但是如果未来代码发生更改,您将不会听到开发人员错误(如错别字)的错误。
.catch()
方法的替代方法是监听未处理的拒绝 。 我个人使用这个来发出警告.catch()
失踪了!
我不认为有很多客观的利弊。 asynchronous非常stream行(基于依赖它的 npm 包 )。
我喜欢控制stream库(特别是asynchronous),因为我更容易理解。 承诺混淆了我,而asynchronous是容易理解的。 我怀疑它只是一个学习曲线的东西,如果我花了很多努力去学习它,承诺会更具可读性。 但是,我应该期待那些试图阅读我的代码的人呢?
还有第三种 – 纤维 。 纤维不能在Windows上工作,但(IMO)提供了应该以串行方式执行的最清晰的语法。
我一直在用这个库的声明性方法进行试验: http : //chainsjs.org还有更多的工作要做,但是它可以让你定义一个“执行映射”,在这个映射中你几乎可以完全控制stream从简单的映射执行。