Hvordan kompilere flere funksjoner i funksjon kjeden i Javascript?

stemmer
0

Jeg ønsker å være i stand til å gi kompilere en funksjon (for en web rammeverk jeg jobber med) inn i en funksjon kjede som sett i de fleste nett rammer. Hva er den enkleste måten å gjøre dette? La oss si jeg har en liste med funksjoner:

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

I det ovennevnte tilfelle, ville det ideelle virkemåten for den første funksjon til trigger, det føres inn parameter nextfor å utløse den neste funksjon og deretter kjedet til slutt på grunn av returnsetningen. Hvordan kunne jeg kompilere dette til en funksjon?

Publisert på 13/01/2020 klokken 23:52
kilden bruker
På andre språk...                            


3 svar

stemmer
0

ikke 100% på dette, men jeg tror at hvis du oppretter en variabel for det ferdige produktet etter den første funksjonen kan du deretter bruke andre funksjonen til det og gi det fra den første funksjonen til andre

Svarte 13/01/2020 kl. 23:58
kilden bruker

stemmer
0

Du kan ganske enkelt redusere rekke funksjoner:

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

Som skal kjøre dem i rekkefølge, passerer et resultat av den forrige samtalen som en parameter til neste samtale, til slutt ender med det endelige resultatet fra den siste funksjonskall.

Som et eksempel, hvis du gjør det med dette som functionList:

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

Resultatet vil bli $9.00

Svarte 14/01/2020 kl. 00:10
kilden bruker

stemmer
0

Ok, jeg har funnet et svar - du kan bruke følgende kode, som jeg tilpasset fra koa-komponere. For å kompilere mellomvare-kjeden kan du bruke følgende funksjon:

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

Du kan kompilere mellomvare funksjoner og kjøre det ut som følgende:

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

// execute compiled middleware chain
compiled();
Svarte 15/01/2020 kl. 19:43
kilden bruker

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