Cómo compilar múltiples funciones en cadena de función en Javascript?

votos
0

Quiero ser capaz de proporcionar una función de compilación (para un framework de desarrollo web que estoy trabajando) en una cadena de funciones como se ve en la mayoría de los frameworks web. ¿Cuál es la manera más fácil de hacer esto? Digamos que tengo una lista de funciones:

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

En el caso anterior, el comportamiento ideal sería que la primera función de gatillo, el pasado en el parámetro nextpara activar la función siguiente y luego la cadena a extremo debido a la returndeclaración. ¿Cómo podría compilar este a una función?

Publicado el 13/01/2020 a las 23:52
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

no al 100% en esto, pero yo creo que si se crea una variable para el producto terminado después de la primera función a continuación, puede aplicar la segunda función a ella y pasarla de la primera función a la segunda

Respondida el 13/01/2020 a las 23:58
fuente por usuario

votos
0

Simplemente puede reducir la gama de funciones:

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

Que ellos se ejecutarán en orden, pasando el resultado de la llamada anterior como parámetro para la siguiente llamada, en última instancia, que termina con el resultado final de la última llamada a la función.

A modo de ejemplo, si haces eso con esto como su functionList:

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

El resultado será $9.00

Respondida el 14/01/2020 a las 00:10
fuente por usuario

votos
0

Ok, he encontrado una respuesta - se puede utilizar el siguiente código, que me he adaptado a partir del koa-componer. Para compilar la cadena de middleware puede utilizar la siguiente función:

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

Se puede compilar funciones de middleware y ejecutarlo como la siguiente:

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

// execute compiled middleware chain
compiled();
Respondida el 15/01/2020 a las 19:43
fuente por usuario

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