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函数
分析:
接下来我们需要做两件事情
1. 通过什么去分析类型?
2. 分析后的类型执行不同的操作
第一件事情:对于判断promise,flow可以通过返回值来判断,promise的返回值有then,flow的返回值可以给他设置一个变量isFlow来做判断。
第二件事:总共有四种类型
switch(key){
'普通函数':直接执行;
'promise类型':new Promise().then(next)
'createFlow类型':currentFunc.run(next)
'数组嵌套类型':createFlow(current)
}
其中next = ()=>createFlow(sources).run(callback)//代表接下来要执行的内容
源码如下:
function createFlow(row){ let sources = effects.slice().flat(); function run(callback) { while (sources.length) { const task = sources.shift(); // 把callback放到下一个flow的callback时机里执行 const next = () => createFlow(sources).run(callback) if (typeof task === "function") { const res = task(); if (res?.then) { res.then(next); return; } } else if (task?.isFlow) { task.run(next); return; } } callback?.(); } return { run, isFlow: true, }; }