一道蚂蚁金服异步串行面试题
题目
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const subFlow = createFlow([() => delay(1000).then(() => log("c"))]);
createFlow([
() => log("a"),
() => log("b"),
subFlow,
[() => delay(1000).then(() => log("d")), () => log("e")],
]).run(() => {
console.log("done");
});
// 需要按照 a,b,延迟1秒,c,延迟1秒,d,e, done 的顺序打印
按照上面的测试用例,实现 createFlow:
- flow 是指一系列 effects 组成的逻辑片段。
- flow 支持嵌套。
- effects 的执行只需要支持串行。
思路
- 将effects里的array拉平
- 因为effects里面有可能有flow,所以flow返回effects给上一层的使用
- 使用async await顺序执行
实现
const createFlow = (effects = []) => {
const sources = effects.reduce((result, effect) => {
if (typeof effect === "function") {
return result.concat(effect);
} else if (Array.isArray(effect)) {
return result.concat(...effect);
} else if (effect instanceof Object) {
if (effect.sources) {
return result.concat(...effect.sources);
}
}
return result
}, []);
const run = async (callback) => {
for (const task of sources) {
await task();
}
callback && callback();
};
return {
run,
sources
};
};