Como compilar várias funções em cadeia de função em JavaScript?

votos
0

Eu quero ser capaz de fornecer compilação uma função (para um framework web que estou trabalhando) em uma cadeia de função, como visto na maioria dos frameworks web. Qual é a maneira mais fácil de fazer isso? Digamos que eu tenho uma lista de funções:

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

No caso acima, o comportamento ideal seria que a primeira função de gatilho, a passou no parâmetro nextpara disparar a próxima função e, em seguida, a cadeia a fim devido à returninstrução. Como eu poderia compilar isso para uma função?

Publicado 13/01/2020 em 23:52
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

não 100% sobre isso, mas eu acredito que se você criar uma variável para o produto concluída após a primeira função, você pode aplicar a 2ª função a ele e passá-lo a partir da primeira função para a segunda

Respondeu 13/01/2020 em 23:58
fonte usuário

votos
0

Você pode simplesmente reduzir a gama de funções:

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

Que irá executá-los em ordem, passando o resultado da chamada anterior como um parâmetro para a próxima chamada, em última análise, terminando com o resultado final da última chamada de função.

Como exemplo, se você fizer isso com este como seu functionList:

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

O resultado será $9.00

Respondeu 14/01/2020 em 00:10
fonte usuário

votos
0

Ok, eu encontrei uma resposta - você pode usar o código a seguir, que eu adaptado de koa-composição. Para compilar a cadeia de middleware você pode usar a seguinte função:

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

Você pode compilar funções de middleware e executá-lo como o seguinte:

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

// execute compiled middleware chain
compiled();
Respondeu 15/01/2020 em 19:43
fonte usuário

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