Hogyan fordítsuk több funkciót be funkciót lánc Javascript?

szavazat
0

Azt akarom, hogy képes legyen biztosítani fordítási funkciót (egy webes keretrendszer dolgozom) egy „funkciót lánc” amint az a legtöbb internetes keretek között. Mi a legegyszerűbb módja ennek? Tegyük fel, hogy van egy lista a funkciók:

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

A fenti esetben, az ideális viselkedés lenne az első funkciót kiváltó, az átadott paraméter next, amely kiváltja a következő függvényt, majd a lánc végén, mivel a returnnyilatkozatot. Hogyan is fordíthatod ezt az egyik funkciója?

A kérdést 13/01/2020 23:52
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

nem 100% -ot, de azt hiszem, ha létrehoz egy változót az elkészült terméket az első funkció akkor majd alkalmazza a 2. funkciót, és adja át az első funkció a második

Válaszolt 13/01/2020 23:58
a forrás felhasználó

szavazat
0

Egyszerűen csökkentheti a tömb funkciók:

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

Hogy fog futni őket annak érdekében, átadva az eredmény az előző hívás, mint a paraméter a következő hívás, végül befejezve a végeredmény az utolsó függvényhívás.

Példaként ha nem, hogy ezzel, mint a functionList:

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

Az eredmény az lesz $9.00

Válaszolt 14/01/2020 00:10
a forrás felhasználó

szavazat
0

Ok, én találtam meg a választ - akkor a következő kódot, amit átvéve koa-levélírás. Összeállításához middleware lánc akkor a következő függvényt:

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

Lefordíthatod middleware funkciók és végre úgy, mint a következő:

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

// execute compiled middleware chain
compiled();
Válaszolt 15/01/2020 19:43
a forrás felhasználó

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