javascript 观察者模式的返回值问题

发布于 2022-09-06 02:56:45 字数 2067 浏览 17 评论 0

观察者实现如下:

var Observer = (function(){
      var __messages = {};
      return {
        regist: function(type, fn){
          if(typeof __messages[type] === 'undefined'){
            __messages[type] = [fn];
          } else {
            __messages[type].push(fn);
          }
        },
        fire: function(type, args){
          if(!__messages[type]){
            return;
          }
          var events = {
            type : type,
            args : args || {}
          },
          i = 0,
          len = __messages[type].length;
          for(; i < len; i++){
            __messages[type][i].call(this, events);
          }
        },
        remove: function(type, fn){
          if(__messages[type] instanceof Array){
            var i = __messages[type].length - 1;
            for(; i >= 0; i--){
              __messages[type][i] === fn && __messages[type].splice(i, 1);
            }
          }
        }
      }
    })();

注册方法如下:

Observer.regist('blurCount1', function(){
      displayBlock('#tips-count'+1);
      var check = inputCheck.bind('#count'+1).checkLength().over();
      var tips = $('#tips-count'+1);
      var count = $('#count'+1);
      if(check === true){
          count.style.borderColor = 'green';
          tips.style.color = 'green';
          tips.innerHTML = '格式正确';
          //返回这个返回值
          return true;
      } else{
          count.style.borderColor = 'red';
          tips.style.color = 'red';
          if(check === 'empty'){
              tips.innerHTML = '姓名不能为空';
          } else{
              tips.innerHTML = '格式错误';
          }
          //返回这个返回值
          return false;
      }
    });

发布消息方法如下:

    addevent($('#count'+1),'blur', function(){
      var ob1 = Observer.fire('blurCount1');
    });

我现在的问题是,如何消息发布时,获取 'blurCount1' 方法的返回值,也就是 ob1 的赋值(这里是undefined,但我想获取的是 true/false,也就是注释掉的地方),能否通过注册事件传递的function来规定返回值

通过全局变量不是我想要的结果,观察者实现时会将返回值存入数组返回也不是我想要的结果(很显然如果多个事件同时监听,返回值会混乱)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凉城 2022-09-13 02:56:45

你同一个消息可以注册多个方法,然后

for(; i < len; i++){
  __messages[type][i].call(this, events);
}

把所有事件都执行。那你所需要的是这个队列的函数执行后返回的哪个值?
如果需要所有的值,把值放入数组返回。如果如你注释只要一个值,那你要哪个值?
如果是需要把所有事件返回

var values = [];
for(; i < len; i++){
  returnValue.push(__messages[type][i].call(this, events));
}
return values;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文