网上看到的一个比较有意思的面试题,题目如下:

问如何让上面的数组输出1,2,3?

这个问题看到有很多答案,都十分的巧妙,现在我们来逐个解读一下。

递归

我们每次只执行数组中的第一个方法,同时,我们向next里面塞一个方法,这个方法会剔除掉数组中的第一个元素然后继续执行数组中“第一个方法”。(注意,这个方法是数组中的第二个方法)

上面的解释的有些绕,看图:

background Layer 1 f1 f2 f3 执行 第一次 f2 f3 执行 第二次 f3 执行 第三次

async await

上面的问题其实就是异步串行,async中利用for配合await可以比较简单的写出异步串行:

reduce Promise.resolve()

在我的另外一篇文章中,有介绍reduce和Promise.resolve()的妙用, reduce使用Promise.resolve()构造连续Promise回调,它们也是解决异步串行的一个方法:

map Promise.resolve()

和上的思路差不多,但是写法略有不同:

Generator

利用Generator方法也是很容易解决这种异步串行问题:

reduceRight

我们假设fucArr中的三个方法分别为f1,f2,f3,那么f1(f2(f3(()=>{})))肯定是可以满足要求的,reduceRight就是把这写方法拼凑成f1(f2(f3(()=>{})))这种形式。

让我们看看reduceRight执行的具体过程:

background Layer 1 let arr=[f1,f2,f3] 第一遍 prev next ()=>{} f3 返回 ()=>{f3(()=>{})} 第二遍 A A f2 ()=>{f2(A)} B 第三遍 B f1 ()=>{f1(B)} 最后的结果为:()=>{f1(()=>{f2(()=>{f3(()=>{})})})}

reduce

上面讲了如何用reduceRight去拼凑f1(f2(f3(()=>{})))这种形式,其实用reduce也可以拼凑的:

它这种拼凑方式我认为是最复杂的,下面看看具体步骤:

background Layer 1 let arr=[f1,f2,f3] prev next f1 f2 结果 f1 -> f2(arg) arg f1 -> f2(arg) arg f3 f1 -> f2(arg) arg f3(arg) 上一个prev的参数 arg 虚线框表示在闭包内,剪头代表参数归谁 第一步 第二步

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字