实现合并功能和返回结果的问题

时间:2019-03-09 19:19:24

标签: javascript

我正在尝试实现CombineFunction

// Sync tasks
function f1(args,function() {  /* Does something */ });
function f2(args,function() {  /* Does something */ });
function f3(args,function() {  /* Does something */ });

const op = combineFxn([f1, f2,f3]);

// After combineFxn is combined, we need to invoke each of the 
// tasks function with 'test' arguments.
op('demo', function() {
    //cb
});

问题陈述:

  
      
  • 实施CombineFxn。

         
        
    • 如果使用test作为参数调用,这应该返回一个函数,应该调用所有三个函数:   f1f2f3(带有参数)。
    •   
  •   
  • operation的最终响应仅应在所有任务完成后返回

  •   
     

所有任务都是同步或异步任务。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则希望将任务组合在一起,然后返回组合的任务。

这是一种用于异步任务的方法。您也可以使用它来运行同步任务,但是由于所有内容都包装在Promise中,因此您将需要使用then来获得结果:

const combineTasks = (...tasks) => (...args) =>
  tasks.reduce(async (previous, task) => {
    const result = await previous;
    return task(result);
  }, Promise.resolve(...args));
  
const delay = ms => new Promise(res => setTimeout(res, ms));

const f1 = x => x + 1;
const f2 = x => x * 2;

const f1Async = async (x) => {
  console.log(x);
  await delay(300);
  return x + 1;
};

const f2Async = async (x) => {
  console.log(x);
  await delay(300);
  return x * 2;
};

// Asynchronous task
const taskAsync = combineTasks(f1Async, f2Async, f1Async);
taskAsync(1).then(r => console.log(r));

// Synchronous task
const task = combineTasks(f1, f2, f1);
task(100).then(r => console.log(r));

如果要使用同步API,可以执行以下操作:

const combineTasks = (...tasks) => args =>
  tasks.reduce((prev, task) => task(prev), args);
  
const f1 = x => { console.log(x); return x + 1; };
const f2 = x => { console.log(x); return x * 2; };

const task = combineTasks(f1, f2, f1);
console.log(task(10));