Nasıl JavaScript işlevi zincirine birden fazla işlevi derlemek?

oy
0

Ben çoğu web çerçeveler görüldüğü gibi bir fonksiyonu zinciri içine (Üzerinde çalıştığım bir web çerçevesi için) bir fonksiyonu derleme sunmak isterler. Bunu yapmanın en kolay yolu nedir? Let ı işlevlerinin bir listesi olduğunu varsayalım:

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

Yukarıdaki durumda, ideal bir davranış parametresinde geçirilen, tetiğe ilk fonksiyon için olacağını nextnedeniyle ucun yanındaki fonksiyonu ve daha sonra zincirini tetiklemek için returndeyimi. Nasıl bir işleve bu derlemek olabilir?

Oluştur 13/01/2020 saat 23:52
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Eğer o zaman kendisine 2 fonksiyonunu uygulamak ve ikinci ilk işlevinden iletebilirsiniz ilk fonksiyonu sonra tamamlanan ürün için değişken oluşturmak eğer bu konuda değil% 100 ama inan

Cevap 13/01/2020 saat 23:58
kaynak kullanıcı

oy
0

Sadece fonksiyonların dizi azaltabilir:

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

Yani sonuçta son işlev çağrısından nihai sonuç ile biten sonraki çağrısına bir parametre olarak önceki çağrısının sonucunu geçerek sırayla çalışacaktır.

Örnek olarak, kendi functionList olarak bu konuda öyle yaparsan:

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

Sonuç şu olur $9.00

Cevap 14/01/2020 saat 00:10
kaynak kullanıcı

oy
0

Tamam, bir cevap buldum - Ne koa-oluşturmadeneyimine uyarlanan aşağıdaki kodu kullanabilirsiniz. Aşağıdaki fonksiyonunu kullanabilirsiniz katman zincirini derlemek için:

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

Sen katman işlevlerini derlemek ve aşağıdaki gibi çalıştırabilirsiniz:

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

// execute compiled middleware chain
compiled();
Cevap 15/01/2020 saat 19:43
kaynak kullanıcı

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