极乐门资源网 Design By www.ioogu.com
前言
朋友去面试蚂蚁金服,遇到了一道面试题,乍一看感觉挺简单的,但是实现起来发现内部值得一提的点还是挺多的。
先看题目:
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 的执行只需要支持串行。
分析
先以入参分析,createFlow 接受一个数组作为参数(按照题意里面的每一项应该叫做 effect),排除掉一些重复的项,我们把参数数组中的每一项整理归类一下,总共有如下几种类型:
普通函数:
() => log("a");
延迟函数(Promise):
() => delay(1000).then(() => log("d"));
另一个 flow:
const subFlow = createFlow([() => delay(1000).then(() => log("c"))]);
用数组包裹的上述三项。
实现
先把参数浅拷贝一份(编写库函数,尽量不要影响用户传入的参数是个原则),再简单的扁平化 flat 一下。(处理情况 4)
function createFlow(effects = []) { let sources = effects.slice().flat(); }
观察题意,createFlow 并不会让方法开始执行,需要 .run() 之后才会开始执行,所以先定义好这个函数:
function createFlow(effects = []) { let sources = effects.slice().flat(); function run(callback) { while (sources.length) { const task = sources.shift(); } callback"htmlcode">function createFlow(effects = []) { let sources = effects.slice().flat(); function run(callback) { while (sources.length) { const task = sources.shift(); if (typeof task === "function") { const res = task(); } } // 在所有任务执行完毕后 执行传入的回调函数 callback"htmlcode">() => delay(1000).then(() => log("d"));那么拿到返回值后,这里直接简化判断,看返回值是否有 then 属性来判断它是否是一个 Promise(生产环境请选择更加严谨的方法)。
if (res"htmlcode">// 把callback放到下一个flow的callback时机里执行 const next = () => createFlow(sources).run(callback) if (typeof task === "function") { const res = task(); if (res"htmlcode">function createFlow(effects = []) { 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"a"), () => console.log("b"), createFlow([() => console.log("c")]), [() => delay().then(() => console.log("d")), () => console.log("e")], ]).run();总结
这道面试题主要的目的是考察对于异步串行流的控制,巧妙的利用自身的递归设计来处理传入的参数也是一个 flow的情况,在编写题目的过程中展示你对 Promise 的熟练运用,一定会让面试官对你刮目相看的~
极乐门资源网 Design By www.ioogu.com
极乐门资源网
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
极乐门资源网 Design By www.ioogu.com
暂无探究一道价值25k的蚂蚁金服异步串行面试题的评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 第五街的士高《印度激情版》3CD [WAV+CUE][2.4G]
- 三国志8重制版哪个武将智力高 三国志8重制版智力武将排行一览
- 三国志8重制版哪个武将好 三国志8重制版武将排行一览
- 三国志8重制版武将图像怎么保存 三国志8重制版武将图像设置方法
- 何方.1990-我不是那种人【林杰唱片】【WAV+CUE】
- 张惠妹.1999-妹力新世纪2CD【丰华】【WAV+CUE】
- 邓丽欣.2006-FANTASY【金牌大风】【WAV+CUE】
- 饭制《黑神话》蜘蛛四妹手办
- 《燕云十六声》回应跑路:年内公测版本完成95%
- 网友发现国内版《双城之战》第二季有删减:亲亲环节没了!
- 邓丽君2024-《漫步人生路》头版限量编号MQA-UHQCD[WAV+CUE]
- SergeProkofievplaysProkofiev[Dutton][FLAC+CUE]
- 永恒英文金曲精选4《TheBestOfEverlastingFavouritesVol.4》[WAV+CUE]
- 群星《国风超有戏 第9期》[320K/MP3][13.63MB]
- 群星《国风超有戏 第9期》[FLAC/分轨][72.56MB]