我正在尝试利用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}}广播。这就是错误或限制。还在发现
答案 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行为感到好奇,是错误还是什么?