Jak sestavit celou řadu funkcí do funkce řetězce Javascript?

hlasů
0

Chci být schopen poskytnout kompilace funkce (pro webové rámci pracuji on) do „funkce řetězce“, jak je vidět ve většině webových frameworků. Co je to nejjednodušší způsob, jak to udělat? Řekněme, že máte seznam funkcí:

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

Ve výše uvedeném případě je ideální chování by bylo pro první funkce na spoušť, předané v parametru nextpro aktivaci další funkce a pak řetěz konci v důsledku returnpříkazu. Jak bych mohl sestavit to na jednu funkci?

Položena 13/01/2020 v 21:52
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

není 100% na toto téma, ale věřím, že pokud vytvoříte proměnnou hotovým výrobkem po prvním funkci pak můžete aplikovat 2. funkce k ní a předat ji od prvního funkci druhého

Odpovězeno 13/01/2020 v 21:58
zdroj uživatelem

hlasů
0

Můžete jednoduše snížit řadu funkcí:

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

Že poběží je v pořádku, procházející výsledek z předchozího volání jako parametr pro další hovor, nakonec končit s konečným výsledkem z posledního volání funkce.

Jako příklad, pokud si, že s tím, jak váš functionList:

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

Výsledkem bude $9.00

Odpovězeno 13/01/2020 v 22:10
zdroj uživatelem

hlasů
0

Ok, jsem našel odpověď - můžete použít následující kód, který jsem se adaptoval od koa-psaní zpráv. Kompilovat middleware řetězce můžete použít následující funkce:

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

Můžete sestavit middleware funkce a spustit jej jako následující:

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

// execute compiled middleware chain
compiled();
Odpovězeno 15/01/2020 v 17:43
zdroj uživatelem

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