最近在开发Backbone.JS / jQuery / CoffeeScript项目时,我发现自己陷入了一堆回调和时间问题。我需要等待一些事情才能完成,然后发现自己陷入了一堆嵌套的回调......这让人感到困惑和难以调试。然后我找到了2个可能的解决方案jQuery deferred或IcedCoffeeScript
IcedCoffeeScript
看起来非常简单,只需添加await
& defer
。但是,我不知道它会留下来吗? StackOverflow上只有2个问题吗?与CoffeeScript相比,没有太多谈论它
另外一个问题是两种方法之间的区别是什么,它们似乎大致相同?除了在IcedCoffeeScript中,它看起来更像是程序代码,并且在jQuery延迟中,它并没有解决我的混乱回调
答案 0 :(得分:18)
这些是非常不同的技术:
IcedCoffeeScript 是一个预编译器,它使用await
和defer
关键字扩展CoffeeScript,为您转换代码,以便您可以以同步方式编写代码。在生成的JavaScript中,await
和defer
生成嵌套函数。
jQuery Deferred (又名 Promises )是一种完全支持回调的方式:异步函数可以返回Promise,而不是进行回调。然后,您将回调附加到Promise。这是一种简单但功能强大的技术。我在我的书 Async JavaScript 中专门写了一章。
这些技术中的每一种都适用于某种API。 await
和defer
期望函数将单个回调作为其最后一个参数。当你的应用中有很多其他Promise时,Promise最有效。
在JavaScript中处理异步行为没有灵丹妙药。您需要了解回调,Promises和PubSub(又名EventEmitter
)并为每项工作选择最佳工具。即使你使用IcedCoffeeScript(这很酷),Promise仍然会为你节省大量的工作。
我希望有所帮助。查看我的书 Async JavaScript ,了解更多信息。
答案 1 :(得分:17)
我认为 IcedCoffeeScript 就在这里。
我计划无限期地支持它,而且我经常在主线上修补它。我几乎在所有个人项目中都使用它,而网站Combosaurus.com,一个即将发布的 OkCupid Labs 项目,是用 IcedCoffeeScript编写的。
答案 2 :(得分:4)
我写了一篇关于标准事件回调,pub sub和deferreds之间差异的博客文章,这可能对你有所帮助:
Event Emitter, Pub Sub or Deferred Promises … which should you choose?
介绍内容如下:
问题的明显答案“你应该选择一个事件 Emitter,Pub Sub或Deferred / Promises“取决于什么 你在干嘛。
在这篇文章中,我将探讨一下每种模式的工作原理 (非常)基本实现,然后我会看看原因 你可以选择一个而不是另一个。
摘要是:
事件发射器是一个真正的经典,并允许良好的做法和 控制发生的事情; Pub Sub更灵活 跨组件事件;延迟和承诺提供了一种强有力的方式 处理回调。
将摘要应用于您的问题 - 我建议Deferred's和Promises可能会帮助您解决问题。
我不了解你,但我发现如何实现Deferred真的帮助我理解使用它的复杂性。我在帖子中也包含了一些示例代码,这些代码非常简单,在查看别人更强大的尝试时可能会帮助你。
答案 3 :(得分:2)
哦,我肯定会依赖IcedCoffeeScript。如果您喜欢并使用CoffeeScript语法,您会发现它只是简单地“混合”它......
关于项目的未来,我前段时间也遇到了同样的困境,但看起来Maxwell Krohn正在积极维护它,并且有一个不断增长的社区和意识(好吧,也许还没有在stackoverflow上)。
我去年开始使用它,现在我无法想象在没有await
和defer
的情况下编写“真实”应用。
你可以在ICS here的优雅异步控制流程上找到一个简短的“protip”,我还写了一个5部分ironically-titled article on using Node.js for generic web projects here提到ICS。