简体   繁体   中英

JS method calling from object value

I'm working on an emulator. The task at hand is an incoming request on a certain endpoint. The request may contain 1-4 options in the req.body.options. The basic design idea is that an object contains the options and the corresponding method calls (as some sort of a sub-router).

let dataActions = {
    option1: optionMethod(param1, param2),
    option2: optionMethod2(param1, param2),
    option3: optionMethod3(params),
    option4: optionMethod4(params)
}

for (key in req.body.options) {
...
}

The for...in should fire the methods (decoupled in other files) when it finds matching in the request with the dataActions keys. Is there a semantical way, or a detailed design pattern to make this work?

The problem is that you already fire the methods yourself.

let dataActions = {
    option1: optionMethod(param1, param2) // <-- this is a function call
}

Doing it this way you assign the result of optionMethod() to option1 . The above is effectively shorthand for

let dataActions = {};
dataActions.option1 = optionMethod(param1, param2);

If that helps making it more obvious.


You don't want to call the methods immediately. You want to store them for later use. Either store them directly:

let dataActions = {
    option1: optionMethod  // <-- this is a function reference
}

...or store a function that calls them in some specific way:

let dataActions = {
    option1: function () {
        return optionMethod('some', 'parameters');
    }
}

now you can use them at a separate time, for example like this

Object.keys(dataActions).filter(a => a in req.body.options).forEach(a => {
    var optionMethod = dataActions[a];
    optionMethod();
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM