Динамически запускать функцию в es6 - PullRequest
0 голосов
/ 10 января 2019

У меня есть файл со списком функций, как показано ниже

export function today() {}

export function yesterday() {}

export function tomorrow() {}

export function out(input) { input() }

input - это имя функции, и оно может быть одной из tomorrow, today или yesterday функций.

Мне просто нужно динамически вызывать функции today, yesterday, tomorrow.

Ответы [ 4 ]

0 голосов
/ 10 января 2019

Как прокомментировано, вам нужно будет создать карту и с помощью нее вы сможете вызывать функции.

Вы можете попробовать один из следующих подходов:

Один экспорт

Преимущество этого подхода в том, что у вас есть один экспорт, так что вы знаете, что вы экспортируете. Однако вам придется прокручивать вверх и вниз, чтобы увидеть определение, если размер файла увеличивается. Кроме того, у вас все кровоточит, поэтому out(...) может вызывать любую функцию, поэтому нет смысла экспортировать их по отдельности

function today() {}
function yesterday() {}
function tomorrow() {}
function out(input) {
  module[input]();
}

var module = {
  today, yesterday, tomorrow, out
}

export module;

Карта возможных функций

Это более рекомендуемый подход. Здесь у вас есть карта возможных действий. Таким образом, вы также ограничиваете возможные входные данные. Это также позволит вам иметь более значимые имена для действия и функции. Недостатком будет необходимость вести список. Поэтому для каждого нового действия вам придется обновлять этот список

export function today() {}
export function yesterday() {}
export function tomorrow() {}

const actionMap = {
  TODAY: today,
  YESTERDAY: yesterday,
  TOMORROW: tomorrow
}

export function out(input) {
  actionMap[input]();
}
0 голосов
/ 10 января 2019
function func_abc() {
    alert("abc");
}
function call_others(function_name) {
    if (function_name == "abc") {
        func_abc();
    }
}
call_others("abc");

Вы можете сделать это или использовать оператор switch

Также один хак - хранить такие функции в переменных и затем вызывать их, получая доступ к ним из свойств объекта модуля. Пример:

var x = { }; 
x.f1 = function()
{
    console.log('Call me as a string!');
}

Теперь вы можете вызвать его, используя значение из строки:

var funcstr = "f1";
x[funcstr]();
0 голосов
/ 10 января 2019

У вас есть два варианта. Выполните поиск с использованием карты или переместите ссылочные функции в другой файл и выполните импорт с использованием подстановочного знака. (что по сути то же самое)

1. С поиском

const lookup = {today, yesterday, tomorrow}
export function today() {}
export function yesterday() {}
export function tomorrow() {}
export function out(input) { lookup[input]() }

2. Разделите ваш код на два файла. index.js и fns.js
index.mjs

import * as lookup from './fns'
export function out(input) { lookup[input]() }  

fns.mjs

export function today() {}
export function yesterday() {}
export function tomorrow() {}
0 голосов
/ 10 января 2019
function func_abc() {
    alert("abc");
}
function call_others(function_name) {
    if (function_name == "abc") {
        func_abc();
    }
}
call_others("abc");

Вы можете сделать это или использовать оператор switch

...