YUI3自定义异步事件无法在Y.Global上运行

时间:2013-08-10 04:36:30

标签: javascript yui3 custom-events

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

Here it is到目前为止我所拥有的,但没有运气。

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);
});

如果有人能提示这段代码有什么问题吗?谢谢。

UPD:

经过一些调查后发现,use()Global个实例内的async events work很好,并且未使用{{1}}广播。这就是错误或限制。还在发现

1 个答案:

答案 0 :(得分:0)

好的,在高层次上,与全局事件(我如何理解)的不一致性存在于Y对象的沙箱性质中。所以在某些时候你可以全局触发同步事件导致异步参数你subscribe到Y实例上的自定义事件而不是进一步传递(而不是YUI使用一些默认值或其他)。这可能是有道理的,但为什么这类事件应该全球可以消防?要么我想念YUI的一些重要部分,这是bug报告的候选者。

无论如何,我没有时间深入YUI,what I really practically need可能包含在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实例只能为一个事件订阅一个动作,但我不需要更多。如果有兴趣,我将来也会尝试debug and enhance this snippet

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