0

我正在尝试利用YUI3 library实现异步事件。因此,即使订阅延迟,应用程序也会收到有关事件传递的通知,类似于加载或就绪事件。

这是我到目前为止所拥有的,但没有运气。

YUI().use('event', 'event-custom', function(Y){

  function onCustomEvent () {
    Y.Global.on('custom:event', function(){
      alert('custom fired');
    });
  }
  window.setTimeout(onCustomEvent, 2000);
});

YUI().use('event', 'event-custom', function(Y){

  Y.publish('custom:event', {
    emitFacade: true,
    broadcast: 2,
    fireOnce: true,
    async: true
  });

  function fireCustomEvent () {
    Y.Global.fire('custom:event');
  }
  window.setTimeout(fireCustomEvent, 1000);
});

如果有人可以提示此代码有什么问题?谢谢你。

升级版:

经过一番调查,事实证明异步事件在一个use()实例内以及不使用Global广播时工作正常。所以这是错误或限制。仍在发现

4

1 回答 1

0

好的,在高层次上,与全局事件的不一致(我如何理解)在于 Y 对象的沙盒性质。因此,在某些时候,您只能在全局范围内触发同步事件,导致异步参数您subscribe自定义事件在 Y 实例上,而不是进一步传递(并且 YUI 使用一些默认值或其他)。这可能是有道理的,但为什么这种事件应该在全球范围内触发呢?要么我错过了 YUI 的一些重要部分,这是错误报告的候选者。

无论如何,我没有时间深入研究 YUI,而我真正需要的可以用 40 行代码来包装:

YUI.add('async-pubsub', function(Y) {
  var subscribers = {};

  if ( !YUI.asyncPubSub ) {
    YUI.namespace('asyncPubSub');
    YUI.asyncPubSub = (function(){
      var eventsFired = {};
      function doPublishFor(name) {
        var subscriber;

        for ( subscriber in subscribers ) {
          if ( subscriber === name ) {
            (subscribers[name]).call();
            delete ( subscribers[name] ); // Keep Planet clean
          }  
        }
      }
      return {
        'publish': function(name, options) {
          eventsFired[name] = options || {};
          doPublishFor(name);
        },
        'subscribe': function(name, callback) {
          if ( subscribers[name] ) {
            Y.log('More than one async subscriber per instance, overriding it.', 'warning', 'async-pubsub');
          }
          subscribers[name] = callback || function() {};
          if ( eventsFired[name] ) {
            window.setTimeout(
              function () {
                doPublishFor(name);
              },0
            );
          }
        }
      };  
    })();
  }
  Y.asyncPubSub = YUI.asyncPubSub;
}, '1.0', {requires: []});

这里有一些限制和优化空间,比如每个use实例只能为一个事件订阅一个动作,但我不需要更多。如果有兴趣,我将来也会尝试调试和增强这个片段。

仍然对 YUI 的行为感到好奇,是 bug 还是什么?

于 2013-08-12T19:36:43.973 回答