【问题标题】:What is *like* a promise but can resolve mutliple times?什么是 *like* 一个承诺,但可以多次解决?
【发布时间】:2015-04-30 04:02:07
【问题描述】:

我正在寻找一种 pub/sub 机制,它的行为类似于 Promise,但可以多次解析,并且行为类似于事件,除非您在通知发生后订阅,它会以最近的值触发。

我知道notify,但deferred.notify 是顺序敏感的,所以它的行为就像一个事件。例如:

d.notify('notify before'); // Not observed :(
d.promise.progress(function(data){ console.log(data) });
d.notify('notify after');  // Observed
setTimeout(function(){ d.notify('notify much later') }, 100); // Also Observed

小提琴:http://jsfiddle.net/foLhag3b/

我想要的通知系统非常适合应该更新以反映其背后数据状态的 UI 组件。在这些情况下,您不需要关心数据是否已经到达,而是希望在数据到达时进行更新。

也许这类似于Immediate mode UIs,但不同之处在于它是基于消息的。

据我所知,基于消息的 UI 更新的最新技术是使用承诺或回调来初始化,然后还绑定更新事件:

myUIComponent.gotData(model.data);
model.onUpdate(myUIComponent.gotData); // doing two things is 2x teh workz :(

我不想两者都做。我不认为任何人都应该这样做,用例很常见,可以抽象。

model.whenever(myUIComponent.gotData); // yay one intention === one line of code

我可以建立一个机制来做我想做的事,但我想看看这样的发布/订阅机制是否已经存在。很多聪明人在CS方面做了很多,我觉得这个概念一定存在,我只是在寻找它的名字。

明确地说,我不想改变整个框架,比如 Angular 或 React。我只在寻找发布/订阅机制。最好是一个具有像notifrlemme-knotouch-base这样的时髦名称的已知概念的实现。

【问题讨论】:

  • SimplGy,在做出重大实施决策之前,我认为您至少应该阅读一下jQuery Callbacks。该页面实际上包含 Pub/Sub 的工作示例。
  • @Roamer-1888:我不知道 jquery 公开了他们的回调辅助方法,这很有趣。然而,它只是一个事件管理系统,您必须在发布之前订阅才能接收消息。避免操作顺序问题对于模块化 UI 很重要。
  • 我认为你想要的可以用 jQuery 回调来完成,这将是一个有趣的练习。您需要建立一个“广义观察者”来观察和记住所有主题。在订阅某个主题以及为自己注册以备将来更新时,订阅者将有权访问该主题迄今为止的历史记录。
  • @Roamer-1888:是的,我会将其归档在“自己实现”下。我认为“流”的概念,特别是代表流的最新值的可观察属性,是我想要抓住的现有概念。我可以编写自己的 pub/sub 来记住每个频道的最新响应,并在订阅发生时推送它们,但听起来其他人做得更好。

标签: events promise publish-subscribe


【解决方案1】:

你会想看看(functional) reactive programming。您正在寻找的概念在 FRP 中称为 BehaviorSignal。它模拟值随时间的变化,并且可以随时检查(持续保持一个值,与离散触发事件的流相反)。

var ui = state.map(render); // whenever state updates, so does ui with render() result

JS 中一些流行的库是 BaconRx,但是它们使用自己的术语:您会发现 propertiesobservables

【讨论】:

猜你喜欢
  • 2022-01-21
  • 2018-03-07
  • 2017-09-07
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多