Hoe kan ik meerdere functies in functie keten samen te stellen in Javascript?

stemmen
0

Ik wil in staat zijn om te voorzien in het compileren van een functie (voor een web framework waar ik aan werk) in een functie keten, zoals gezien in de meeste web frameworks. Wat is de makkelijkste manier om dit te doen? Laten we zeggen dat ik een lijst met functies:

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

In het bovenstaande geval zou het ideale gedrag van de eerste functie trekker, de parameter doorgegeven nextnaar de volgende functie en vervolgens de ketting einde triggeren vanwege de returnverklaring. Hoe kon ik stellen dat dit een functie?

De vraag is gesteld op 13/01/2020 om 23:52
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

niet 100% op deze, maar ik denk dat als je een variabele voor het afgewerkte product na de eerste functie die u vervolgens de 2e functie kan van toepassing zijn en door te geven vanaf de eerste functie om de tweede te maken

antwoordde op 13/01/2020 om 23:58
bron van user

stemmen
0

U kunt gewoon verminderen van de reeks van functies:

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

Dat zal ze uit te voeren in het oog, het passeren van het resultaat van de vorige oproep als een parameter voor het volgende gesprek, uiteindelijk eindigend met het uiteindelijke resultaat van de laatste functie gesprek.

Als voorbeeld, als je dat doet met dit als uw functieLijst:

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

Het resultaat zal zijn $9.00

antwoordde op 14/01/2020 om 00:10
bron van user

stemmen
0

Ok, ik heb een antwoord gevonden - u kunt de volgende code, die ik overgenomen van KOA-compose gebruiken. Om de middleware ketting kunt u de volgende functie te compileren:

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

U kunt samenstellen middleware functies en uit te voeren als volgt uit:

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

// execute compiled middleware chain
compiled();
antwoordde op 15/01/2020 om 19:43
bron van user

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