14

最近在处理 Backbone.JS/jQuery/CoffeeScript 项目时,我发现自己陷入了一堆回调和时间问题。在继续之前,我需要等待某些事情完成,然后发现自己陷入了一堆嵌套的回调中……这令人困惑且难以调试。然后我找到了 2 个可能的解决方案jQuery deferredIcedCoffeeScript

IcedCoffeeScript看起来很简单,只需添加await& defer。但是,我想知道它是否会留下来?StackOverflow 上只有 2 个问题?与 CoffeeScript 相比,没有太多谈论它

另一件事是这两种方法之间有什么区别,它们似乎做的大部分事情都是一样的?除了在 IcedCoffeeScript 中,它看起来更像程序代码,而在 jQuery deferred 中,它并没有解决我的回调问题

4

4 回答 4

18

这些是非常不同的技术:

  • IcedCoffeeScript是一个预编译器,它使用awaitdefer关键字扩展 CoffeeScript,为您转换代码,以便您可以以同步风格编写代码。在生成的 JavaScript 中,await生成defer嵌套函数。

  • jQuery Deferred(又名Promises)是一种完全回避回调的方式:异步函数可以返回 Promise,而不是回调。然后将回调附加到 Promise。这是一种简单但功能强大的技术。我在我的书Async JavaScript中专门用了一章来介绍它。

这些技术中的每一种都最适用于某种 API。awaitdefer期望一个函数将单个回调作为其最后一个参数。当您的应用程序中有许多其他 Promise 时,Promise 效果最好。

处理 JavaScript 中的异步行为没有灵丹妙药。您需要了解回调、Promises 和 PubSub (aka EventEmitters),并为每项工作选择最佳工具。即使您使用 IcedCoffeeScript(这很酷),Promise 仍然会为您节省大量工作。

我希望这会有所帮助。查看我的书Async JavaScript了解更多信息。

于 2012-07-08T14:55:30.220 回答
17

我认为IcedCoffeeScript将继续存在。

我计划无限期地支持它,并且经常针对主线修补它。我几乎在我所有的个人项目中都使用它,并且网站 Combosaurus.com,一个即将发布的OkCupid Labs项目,是用IcedCoffeeScript 编写的。

于 2013-01-15T15:58:22.283 回答
4

我写了一篇关于标准事件回调、pub sub 和 deferreds 之间差异的博客文章,这可能会对您有所帮助:

Event Emitter、Pub Sub 或 Deferred Promises……你应该选择哪一个?

简介如下:

对于“你应该选择事件发射器、发布订阅还是延迟/承诺”这个问题的明显答案是,这取决于你在做什么。

在这篇文章中,我将探讨一下每种模式如何与(非常)基本的实现一起工作,然后我会看看为什么你可能会选择一种模式而不是另一种模式。

总结是:

Event Emitter 是一个真正的经典,它允许良好的实践和对发生的事情的控制;Pub Sub 对于跨组件事件更灵活;Deferred 和 Promises 提供了一种处理回调的强大方法。

将摘要应用于您的问题 - 我建议 Deferred's 和 Promises 可能会对您有很大帮助。

我不了解你,但我发现了解如何实现 Deferred 确实帮助我理解了使用它的复杂性。我在帖子中也包含了一些示例代码,它们(非常)简单,在查看其他人更强大的尝试时可能会帮助您。

于 2012-10-02T09:05:43.557 回答
2

哦,我肯定会依赖 IcedCoffeeScript。如果你喜欢并使用 CoffeeScript 语法,你会发现它只是自然地“融合”了它......

关于项目的未来,我前段时间也遇到了同样的困境,但看起来 Maxwell Krohn 正在积极维护它,并且围绕它的社区和意识也在不断增长(好吧,也许还没有在 stackoverflow 上)。

我去年开始使用它,现在我真的无法想象没有awaitand的情况下编写“现实生活”应用程序defer

您可以在此处找到有关使用 ICS 的优雅异步控制流的简短“提示” ,我还写了一篇由 5 部分组成的具有讽刺意味的文章,关于在此处提到 ICS 使用 Node.js 进行通用 Web 项目。

于 2013-09-30T14:20:23.700 回答