异步串行

175 阅读1分钟
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, }; }