博客
关于我
Promise串行执行
阅读量:489 次
发布时间:2019-03-07

本文共 1085 字,大约阅读时间需要 3 分钟。

面试中遇到了一道关于Promise数组循环执行的题目,看起来还真难呢!让我好好理清楚思路。

题目描述

我们有一个函数 fn,它返回一个Promise。函数会在500毫秒后执行,并输出当前的索引。现在有一个数组 arr1 = [1, 2, 3],需要用 reduce 方法将Promise数组循环执行。同时,还有一个loop函数,使用asyncawait来实现同样的效果,我们需要比较这两种方法的实现方式。

方法一:使用 reduce 进行处理

const fn = function (i) {  return new Promise((resolve, reject) => {    setTimeout(() => {      console.log(i);      resolve();    }, 500);  });};var arr1 = [1, 2, 3];arr1.reduce((pre, next) => {  return pre.then(() => fn(next));}, Promise.resolve());

这种写法的关键在于将 reduce 变成一个 then 链,将每个 next 对应的 fn 放进去。但这样做是否真的能完全实现并行执行呢?其实这只是将每个 fn 放在一个单独的 then 链上执行,虽然不会等待每个 fn 完成,但不会形成并行的方式。

方法二:使用 asyncawait

const loop = async function(arr) {  for (let i = 0; i < arr.length; i++) {    await fn(arr[i]);  }};loop(arr1);

这种写法显然更直观,通过 await 关键字,我们可以直接在循环中等待每个 fn 的完成。这样每个操作都会依次执行,并且等待前一个完成才执行下一个,整体的执行顺序很清楚。

对比两种方法

从代码实现来看,第二种方法更加直观和直接,容易让开发者理解和维护。而第一种用 reduce 的方式,虽然也能实现类似的效果,但对 async/await 的理解不足的情况下,容易造成混淆。

在实际应用中,选择哪种方法取决于具体的需求。如果需要保持原有的 reduce 结构,或者想展示对 higher-order functions 的掌握,可以选择第一种方法。但如果更关注代码的可读性和简洁性,第二种方法明显更优。

总之,面试中看到这两种实现方式,应该能够结合实际场景,清晰地表达自己的理解,以及对代码的优劣之评。

转载地址:http://irkcz.baihongyu.com/

你可能感兴趣的文章
Nginx代理访问提示ERR_CONTENT_LENGTH_MISMATCH
查看>>
Nginx代理配置详解
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
查看>>
Nginx使用proxy_cache指令设置反向代理缓存静态资源
查看>>
Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
查看>>
nginx反向代理
查看>>
Nginx反向代理
查看>>
nginx反向代理、文件批量改名及统计ip访问量等精髓总结
查看>>
Nginx反向代理与正向代理配置
查看>>
Nginx反向代理及负载均衡实现过程部署
查看>>
Nginx反向代理和负载均衡部署指南
查看>>
Nginx反向代理是什么意思?如何配置Nginx反向代理?
查看>>
nginx反向代理解决跨域问题,使本地调试更方便
查看>>
nginx反向代理转发、正则、重写、负摘均衡配置案例
查看>>
Nginx反向代理配置
查看>>
Nginx启动SSL功能,并进行功能优化,你看这个就足够了
查看>>
nginx启动脚本
查看>>
Nginx在Windows上和Linux上(Docker启动)分别配置基本身份认证示例
查看>>
Nginx在Windows下载安装启动与配置前后端请求代理
查看>>