Как скомпилировать несколько функций в функции цепи в JavaScript?

голоса
0

Я хочу, чтобы быть в состоянии обеспечить компиляции функции (для веб-рамки, я работаю) в «функции цепи», как показано в большинстве фреймворков. Что это самый простой способ сделать это? Скажем, у меня есть список функций:

const middleware = [
function(data, next){
    console.log(data); 
    next()
},
function(data, next) {
   return;
}, function(data, next) { }];

В приведенном выше случае, поведение было бы идеальным для первой функции на спусковой крючок, переданный в параметре , nextчтобы вызвать следующую функцию , а затем цепь к концу из - за returnзаявления. Как я мог собрать это в одну функцию?

Задан 13/01/2020 в 21:52
источник пользователем
На других языках...                            


3 ответов

голоса
0

не 100% на это, но я верю, что если вы создаете переменную для готового продукта после первой функции вы можете применить 2-й функции к нему и передать его от первой функции на второй

Ответил 13/01/2020 в 21:58
источник пользователем

голоса
0

Вы можете просто сократить набор функций:

functionList.reduce((output, fn) => fn(output), undefined);

Это будет запускать их в порядке, передавая результат предыдущего вызова в качестве параметра для следующего вызова, в конечном счете, заканчивая конечным результатом от вызова последней функции.

В качестве примера, если вы сделаете это с этим в качестве functionList:

[
  () => 4,
  n => n+5,
  n => `$${n}`,
  amt => amt + '.00'
]

Результат будет $9.00

Ответил 13/01/2020 в 22:10
источник пользователем

голоса
0

Хорошо, я нашел ответ - вы можете использовать следующий код, который я адаптировано из коа-композа. Для компиляции цепи промежуточного слоя можно использовать следующую функцию:

function compiler(middleware) {
  // return function to execute compiled middleware chain
  return function(data, next) {
    // set pointer to 0 to match middleware index to track if next()
    // is called twice in one middleware
    let pointer = 0;
    function dispatch(i) {
      // check if pointer is larger than i, indicating next() was called more than once
      if (i < pointer)
        return Promise.reject(
          new Error("next() called multiple times in one middleware function.")
        );
      // set pointer to next index
      pointer = i + 1;
      // grab current function
      let fn = middleware[i];
      // if out of middleware, assign the next function from the parameters to be executed next
      if (i === middleware.length) fn = next;
      // if no function (out of middleware and no provided parameter), end middleware execution
      if (!fn) return Promise.resolve();
      try {
        // run next function, binding the second parameter to the next middleware in the chain
        return Promise.resolve(fn(data, dispatch.bind(null, i + 1)));
      } catch (err) {
        return Promise.reject(err);
      }
    }
    // start function on first middleware
    return dispatch(0);
  };
};

Вы можете компилировать функции промежуточного слоя и выполнить его так:

const funcs = [
     function(data, next){
          console.log(data); next();
     }, function(data, next){
        console.log('done');
     }];
const compiled = compiler(funcs);

// execute compiled middleware chain
compiled();
Ответил 15/01/2020 в 17:43
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more