Шаблонная функция с параметрами с асинхронной библиотекой - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь написать оболочку, чтобы я мог удалить дублирующийся код, распространяющийся между различными файлами.У меня есть пара рабочих, которая принимает список параметров и обратный вызов.Если какое-либо условие выполняется, оно вызывает другую службу и вызывает обратный вызов с результатом, в противном случае выполняется обратный вызов с пустым массивом.

Worker1.js
~~~~~~~~~
export function get(shouldCall, param11, param12, callback) {
  if(shouldCall) {
    someService.get(param11, param12, callback);
  } else {
    callback(null, []);
  }
}

Worker2.js
~~~~~~~~
export function get(shouldCall, param21, callback) {
  if(shouldCall) {
   someOtherService.get(param21, callback);
  } else {
    callback(null, []);
  }
}

Эти работники фактически вызваны из коллектора следующим образом.Я использую библиотеку async.

collector.js
   ~~~~~~~~~~~~
    import async from 'async';

    function doSomething(callback) {
      async.auto({
        worker1Result: async.apply(worker1.get, true, 'abc', 'xyz'),
        worker2Result: async.apply(worker2.get, true, 'mno', 'uvw')
      }, (err, result) => {
        callback(err, result);
      })
    }

Я надеюсь вызвать этот шаблон из коллектора примерно так:

function doSomething(callback) {
  const serviceOneCall = async.apply(someService.get, param11, param12);
  const serviceTwoCall = async.apply(someService.get, param11, param12);

  async.auto({
    worker1Result: async.apply(template.execute, true, serviceOneCall),
    worker2Result: async.apply(template.execute, true, serviceTwoCall)
  }, (err, result) => {
    callback(err, result);
  })
}

Я попробовал шаблон примерно так, как показано ниже.Проблема в том, что я не вижу способа передачи параметров в сервисный вызов.Любое предложение?

template.js
~~~~~~~~~~~
  export function execute(shouldCall, serviceToCall, callback) {
      if (shouldCall) {
          return serviceToCall();              
      }

      return [];
  }

1 Ответ

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

Предоставить дополнительные параметры для функции execute, а затем использовать синтаксис деструктурирования или метод apply:

function execute1(shouldCall, serviceToCall, callback, ...args) {
  if (shouldCall) {
    return serviceToCall(...args);              
  }

  return [];
}
  
function execute2(shouldCall, serviceToCall, callback) {
  if (shouldCall) {
    return serviceToCall.apply(undefined, Array.prototype.slice.call(arguments, 3));              
  }

  return [];
}
  
execute1(true, console.log.bind(console), null, 1, 2, 3);
execute2(true, console.log.bind(console), null, 4, 5, 6, 7);
...