为长轮询彗星应用编写 $httpProvider

writing an $httpProvider for a long-polling comet app

TL;DR: 是否有 Angular 与长轮询集成的示例? (示例,特别是彗星示例会很好!)

我们当前的应用程序使用 Angular 和 Comet。客户端发出长轮询请求,这些请求保持打开状态,直到服务器有数据到达 return。当服务器 returns 数据时,数据负载可能有几条消息用于不同的 'channels'.

我们拥有的开箱即用的 Comet JS 代码使用 jQuery 的 $.get(), $.post() 方法来发出长轮询请求。

Angular 建立在 jQuery 的精简版之上,与 $.get()/$.post() 相比,通过 Angular' 添加了很多(Angular 相关的)魔法s $http 对象。

有人告诉我 Angular 的 $http 对象及其 return 的承诺与基于消息的前端不兼容,但我不是确信

他们真的不相容吗?

我在想可以编写一个不同的 $httpProvider 可以感知彗星,它将提供一个 $http 对象,基于 URL 可以确定它是否应该正常运行 ajax 模式或长轮询模式。

这里的想法是,通常每个 Comet 通道都有一个消息侦听器,并且该侦听器有一个回调,它调用传递消息。

对我来说,这似乎是变相的承诺。一般来说,这个想法是为每个渠道创建一个承诺。当 $http 对象处理长轮询请求时,当服务器响应数据时,它会知道如何将负载解析为每个通道的消息,然后解析每个通道(现在是 [=49= 中的承诺) ] 世界)。解析每个通道会产生调用 channels/promises then() 函数的效果。

这不是通过监听器和回调来实现基于消息的行为吗?这些只是相同的东西,只是名称不同吗?

我正在考虑尝试使用该方法并可能对其进行原型设计。但在我这样做之前,这是否有意义?

这些承诺如何在 Angular HTML 模板中解决我仍然不确定。

是否已经有 Angular 与长轮询集成的示例?

我找不到。

"Does this even make sense?",不完全是。

看来您需要的客户端是:

固定

  • 一组固定的 Angualr 侦听器(可能每个频道一个,但可能每个频道每个消息类型一个)。

每个轮询周期

  1. 长轮询发起者/监听者
  2. 消息包解析器/事件广播器

看问题的时候,好像你没有把(1)和(2)分清楚。

(1) 将是一个 $http() 请求,returns 一个承诺。

(2) 将是一个定制函数,每当请求得到满足时(每当承诺实现时)就会被调用。

因此,每个轮询周期将严格包含一个承诺,但一个或多个广播事件,将由固定听众

它就像一把散弹枪,每次扣动扳机时都会发射一发子弹(以及一组喜欢被射击的自愿目标)。

请注意,在这个定义级别,整个事情在概念上与常规短轮询相同,而长轮询仅在请求和响应的时间上有所不同(这样服务器显然处于控制之中).