DEV Community

Discussion on: [Challenge] log("this") or log("this").withData({})

Collapse
 
jessesolomon profile image
Jesse Solomon

Thanks for another fun challenge!

This took quite a bit of thinking, but I ended up working with the fact that setTimeout isn't actual asynchronous.
So here's what my log function looks like:

function log(text) {
    let logger = {
        label: "Log:",
        message: [ text ],
        withData(...data) {
            this.label = "withData:";
            this.message.push(...data);
        }
    };

    setTimeout(() => console.log(logger.label, ...logger.message), 0);

    return logger;
}
Enter fullscreen mode Exit fullscreen mode

And it passes the tests, of course!

log("test"); // > log: test
log("test").withData(2); // > withData: test 2
Enter fullscreen mode Exit fullscreen mode

It can even handle more complicated synchronous behavior!

let logger = log("Here's a");

if (Math.random() > 0.5) {
    logger.withData("number", Math.random());
}
else {
    logger.withData("boolean", Math.random() > 0.5);
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
nombrekeff profile image
Keff

I'm glad you enjoyed it :) cool solution. More extensible than mine for sure.