Функция Composer для привязки последовательности обратных вызовов - PullRequest
0 голосов
/ 30 мая 2018

Сообщество StackOverflow.Я пытаюсь создать функцию, которая будет составлять последовательность обратных вызовов, чтобы я мог запускать их в правильном порядке.

function Number1 (callback) {
   do something...
   callback();
}

function Number2 (callback) {
   do something...
   callback();
}

function Number3 (callback) {
   do something...
   callback();
}

Если мы думаем об этом как о массиве функций, каждая функция обратного вызоваполучает следующую функцию как свой собственный обратный вызов.То есть: функция Number1 получает функцию Number2 в качестве своего обратного вызова, которая, в свою очередь, получает функцию Number3 в качестве своего обратного вызова и так далее и т. д.

Итак, для функции:

RunThem(callbacks) {
   ...
}

RunThem(Number1, Number2, Number3);

Составной результат должен выглядеть следующим образом:

Number1.bind(this, Number2.bind(this, Number3))

Есть ли способ сделать это с помощью карри или подобного подхода?

Заранее спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Есть много способов сделать это.Вы можете использовать reduceRight для этого:

const func = callbacks.reduceRight(
   // not sure what you want `this` to refer to, so using `null` instead
  (func, callback) => callback.bind(null, func)
);

function noop() {}

function runThem(...callbacks) {
  callbacks.reduceRight(
    (func, callback) => callback.bind(null, func),
    noop
  )();
}

function Number1 (callback) {
   console.log(1);
   callback();
}

function Number2 (callback) {
   console.log(2);
   callback();
}

function Number3 (callback) {
   console.log(3);
   callback();
}

runThem(Number1, Number2, Number3);

Вы также можете полностью избежать .bind и работать с функциями выключения стека:

function runThem(...callbacks) {
  callbacks.shift()(function run() {
    if (callbacks.length > 0) {
      callbacks.shift()(run);
    }
  });
}

function Number1 (callback) {
   console.log(1);
   callback();
}

function Number2 (callback) {
   console.log(2);
   callback();
}

function Number3 (callback) {
   console.log(3);
   callback();
}

runThem(Number1, Number2, Number3);
...