【问题标题】:Java Script Pub/Sub pattern passing unique parametersJavascript Pub/Sub 模式传递唯一参数
【发布时间】:2019-02-27 21:02:32
【问题描述】:

使用 Java Script 中的发布/订阅者模式,例如,如果发布者发布了一个事件并且该事件有 3 个订阅者,那么如果一个订阅者需要一个“某个值”的参数来完成它的工作而另一个订阅者需要一个“某个值”的参数,那么该怎么办?订户需要和“一些不同的价值”的论点来完成它的工作等?

所以 'func1'、'func2' 和 'func3' 将在按钮点击事件发布时触发。每个 'func' 都需要一个唯一的参数。此按钮点击代码只是示例。

  let events = {},
      subUid = -1;

  let pubsub = {
      subscribe : function(evt, func, args) {
          if (!events[evt]) {
              events[evt] = [];
          };

          let token = (++subUid).toString();

          events[evt].push({
              token : token,
              func : func
          });

          return token;
      },

      unsubscribe : function(token) {
          for (let m in events) {
              if (events[m]) {

                  for (let i = 0, j = events[m].length; i < j; i++) {
                      if (events[m][i].token === token) {
                          events[m].splice( i, 1 );
                          return token;
                      };
                  };
              };
          };
          return this;
      },

      publish : function(evt, args) {
          if (!events[evt]) {
              throw ''+evt+' doesn\'t exist!';
          };

          const subscribers = events[evt];
          const len = (subscribers) ? subscribers.length : 0;

          for (let i = 0; i < len; i++) {
              subscribers[i].func(evt, args); // What to do here??!
          };

          return this;
      }
  };

/* ------------------- 实现 -------- */

  $('#myButton').on('click', this, function(event) {
      let someVal = [2, 3, 4];
      someHandler(someVal);
  });

  const func1 = (evt, someVal)=> {
            let total = someVal * 5;
            console.log(total);
        },
        func2 = (evt, someDifferentVal)=> {
            let total = someDifferentVal * 10;
            console.log(total);
        },
        func3 = (evt, anotherDifferentVal)=> {
            let total = anotherDifferentVal * 15;
            console.log(total);
        };

  let subscription1 = pubsub.subscribe('newEventA', func1),
      subscription2 = pubsub.subscribe('newEventA', func2),
      subscription3 = pubsub.subscribe('newEventA', func3);


  let someHandler = (args)=> {
      pubsub.publish('newEventA', args);
  };

【问题讨论】:

  • 您能详细说明一下吗?发布代码 sn-p 或给出某种示例。你到底想达到什么目的?

标签: javascript parameters unique publish-subscribe


【解决方案1】:

事件允许您将触发事件的组件与使用事件的组件分离。

让触发事件的组件担心哪个消费者需要什么,这违背了事件的目的,假设是触发并忘记。

您的发布者应将其可以提供的所有信息打包到参数中,并让消费者自己找出并提取相关信息。

例如,您可能希望发送其他参数并将它们打包到一个对象中,而不是只在publish 命令中发送id。 例如

pubsub.publish('newEventA', { id: 1, name: 'someName', ... });

需要id 的事件会知道从参数中提取id,而需要其他字段的事件会知道如何提取它们。

此外,您的平台可能有一个用于创建和触发自定义事件的库。

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events

【讨论】:

  • 非常感谢您!我明白你在说什么。 “让组件触发事件担心哪个消费者需要什么”确实违背了目的!我有点怀疑可能是这种情况,但我不确定。我会查看您提供的链接。我刚刚编辑了我的问题,询问如何让消费者自己弄清楚并提取相关信息。这实际上是我问题的本质。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2016-06-02
相关资源
最近更新 更多