Wie mehrere Funktionen in Funktionskette in Javascript kompilieren?

stimmen
0

Ich mag die Kompilierung eine Funktion zur Verfügung stellen zu können (für einen Web-Framework ich arbeite) in eine „Funktionskette“, wie er in den meist Web-Frameworks gesehen. Was ist der einfachste Weg, dies zu tun? Lassen Sie uns sagen, dass ich eine Liste von Funktionen haben:

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

Im obigen Fall, würde das ideale Verhalten für die erste Funktion auszulösen sein, die in Parametern übergaben nextdie nächste Funktion und dann die Kette zu Ende triggern aufgrund der returnAussage. Wie könnte ich dies auf eine Funktion kompilieren?

Veröffentlicht am 13/01/2020 um 21:52
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

nicht zu 100% auf das, aber ich glaube, wenn Sie eine Variable für das fertige Produkt nach der ersten Funktion erstellen, können Sie dann auf die zweite Funktion anwenden und sie von der ersten Funktion zum zweiten Pass

Beantwortet am 13/01/2020 um 21:58
quelle vom benutzer

stimmen
0

Sie können einfach die Anordnung von Funktionen reduzieren:

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

Das wird sie um, vorbei das Ergebnis des vorherigen Aufrufs als Parameter für das nächste Gespräch führen, letztlich mit dem Endergebnis aus dem letzten Funktionsaufruf endet.

Als Beispiel, wenn Sie das tun, mit dieser als Functionlist:

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

Das Ergebnis wird sein, $9.00

Beantwortet am 13/01/2020 um 22:10
quelle vom benutzer

stimmen
0

Ok, ich habe eine Antwort gefunden - Sie den folgenden Code verwenden können, die ich von koa-compose angepasst. Um die Middleware-Kette kompilieren Sie die folgende Funktion verwenden:

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

Sie können Middleware-Funktionen kompilieren und ausführen wie folgt aus:

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

// execute compiled middleware chain
compiled();
Beantwortet am 15/01/2020 um 17:43
quelle vom benutzer

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