PubSub
PubSub copied to clipboard
args duplication bug
args duplication bug
Error
let PubSub = window.PubSub;
PubSub.subscribe("anEvent", function(eventName, eventData) {
console.log(`\neventName =`, eventName);
console.log(`\neventData =`, eventData);
// undefined
console.log(eventData.something);
// Uncaught TypeError: Cannot read property 'something' of undefined
console.log(eventData.someOtherThing);
// Uncaught TypeError: Cannot read property 'something' of undefined
});
setTimeout(() => {
PubSub.publish(
"anEvent", // 1 + 1 args & name
{
something: 1,
someOtherThing: 2
},// data
);
}, 1000);
OK
but duplication
name
argument
let PubSub = window.PubSub;
PubSub.subscribe("anEvent", function(eventName, eventData) {
console.log(`\neventName =`, eventName);
console.log(`eventData =`, eventData);
console.log(eventData.something);
console.log(eventData.someOtherThing);
});
// args bug
PubSub.subscribe("anEvent", function(eventName, eventData) {
console.log(`\neventName =`, eventName);
// "anEvent"
console.log(eventName.something + 1);
console.log(eventName.someOtherThing + 3);
});
setTimeout(() => {
PubSub.publish(
"anEvent",// 1 + 2 args
"anEvent",// name
{
something: 1,
someOtherThing: 2
},// data
);
}, 1000);
solution
args
0
/**
* @description pubsub.publish = pubsub.pub
*/
pubsub.publish = pubsub.pub = function(event) {
checkEvent(event);
if (!handlers[event]) {
return;
}
var ctx = {
event: event,
// args: Array.prototype.slice.call(arguments, 1),
args: Array.prototype.slice.call(arguments, 0),
};
for (var i = 0;i < handlers[event].length; i++) {
handlers[event][i].apply(ctx, ctx.args);
}
};
test
// args bug
PubSub.subscribe("testEvent", function(eventName, eventData) {
console.log(`\neventName =`, eventName);
// "anEvent"
console.log(`\neventData =`, eventData);
console.log(eventData.something);
console.log(eventData.someOtherThing);
});
setTimeout(() => {
PubSub.publish(
"testEvent", // 1 + 1 args & name
{
something: 1,
someOtherThing: 2
},// data
);
}, 1000);
result