我正在尝试实现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
作为参数调用,这应该返回一个函数,应该调用所有三个函数:f1
,f2
和f3
(带有参数)。
operation
的最终响应仅应在所有任务完成后返回所有任务都是同步或异步任务。
答案 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));