【问题标题】:Templating function with params with async library带有参数的模板函数和异步库
【发布时间】:2023-04-11 03:51:01
【问题描述】:

我正在尝试编写一个包装器,以便可以删除分布在不同文件中的重复代码。我有几个工人需要参数列表和回调。如果某些条件为真,它会调用其他服务并使用结果调用回调,否则使用空数组调用回调。

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 [];
  }

【问题讨论】:

    标签: javascript callback async.js


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多