2013-08-10 2 views
0

Я пытаюсь реализовать асинхронное событие, используя YUI3 library. Таким образом, приложение было уведомлено о событии, прошедшем даже с поздней подпиской, например, как загрузка или готовые события.YUI3 пользовательские асинхронные события не работают на Y.Global

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:

После немного исследований оказывается, что async events work штраф внутри одного use() экземпляра и, если не используется Global вещания. Так что это что-то вроде ошибки или ограничения. Все еще обнаружено

ответ

0

Хорошо, на высоком уровне несогласованность с глобальными событиями (как я это понял) лежит в природе песочницы объекта Y. Поэтому в какой-то момент вы можете запускать только события синхронизации глобально, вызывая асинхронные параметры subscribe для пользовательского события, выполненного на экземпляре Y, и не передается дальше (а YUI использует некоторые значения по умолчанию или что-то еще). Возможно, это имеет смысл, но почему такие события должны быть огнестрельными в глобальном масштабе? Либо я пропускаю значительную часть YUI, и это кандидат на отчет об ошибке.

Во всяком случае у меня нет времени, чтобы глубже погрузиться в 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, это ошибка или что-то в этом роде?

+0

ссылка на открытую проблему github https://github.com/yui/yui3/issues/1078 – dmi3y

Смежные вопросы