Jak skompilować kilka funkcje w łańcuchu funkcji w JavaScript?

głosy
0

Chcę być w stanie zapewnić kompilacji funkcji (dla ram internetowej pracuję nad) w „łańcuchu funkcję” jak widać w większości ram internetowych. Co to jest najprostszym sposobem, aby to zrobić? Powiedzmy mam listę funkcji:

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

W powyższym przypadku, zachowanie Ideałem byłoby dla pierwszej funkcji do wywołania, przekazany w parametrze next, aby wywołać kolejną funkcję, a następnie łańcuch do końca ze względu na returnoświadczenia. Jak mogę skompilować to do jednej funkcji?

Utwórz 13/01/2020 o 21:52
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

nie 100% na to, ale ja wierzę, jeśli utworzyć zmienną do ukończonego produktu po pierwszej funkcji można następnie zastosować 2nd funkcji i przekazać go od pierwszego do drugiego funkcji

Odpowiedział 13/01/2020 o 21:58
źródło użytkownik

głosy
0

można po prostu zmniejszyć szereg funkcji:

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

To będzie uruchomić je w kolejności, przechodząc wynik poprzedniej rozmowy jako parametr do następnej rozmowy, ostatecznie kończąc na ostateczny wynik z ostatniego wywołania funkcji.

Jako przykład, jeśli to zrobisz z tym jako functionList:

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

Rezultatem będzie $9.00

Odpowiedział 13/01/2020 o 22:10
źródło użytkownik

głosy
0

Ok, znalazłem odpowiedź - można użyć następującego kodu, którego adaptacja Koa-komponować. Skompilować łańcuch middleware można użyć następujących funkcji:

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

Można skompilować funkcje warstwy pośredniej i wykonać go jak poniżej:

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

// execute compiled middleware chain
compiled();
Odpowiedział 15/01/2020 o 17:43
źródło użytkownik

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