PubSub icon indicating copy to clipboard operation
PubSub copied to clipboard

args duplication bug

Open xgqfrms opened this issue 6 years ago • 1 comments

args duplication bug

image

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

xgqfrms avatar May 28 '18 06:05 xgqfrms

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

image

xgqfrms avatar May 28 '18 06:05 xgqfrms