JavaScript实现串行请求的示例代码


Posted in Javascript onSeptember 14, 2020

使用async和await

var fn = async function(promiseArr) {
 for(let i = 0,len = arr.length; i<len; i++) {
  currentPromise = (promiseArr[i] instanceOf Promise) ? promiseArr[i] : Promise.resolve(promiseArr[i]);
  var result = await currentPromise;
  console.log(result)
 }
 }
 fn(arr)

Promise实现

依照 promises 规范,一旦一个 promise 被创建,它就被执行了。如果then方法里返回的是一个promise对象,那么执行下一个then 的时候必定是在上一个then执行完之后执行。

关键点在于then的时候再创建

var createPromise = function(time) {
 return (resolve, reject)=> {
  return new Promise((resolve, reject)=>{
   setTimeout(()=>{
    console.log('timein'+time)
    resolve();
   }, time*1000)
  })
 }
}

function serpromise(arr) {
 arr.reduce((pre, next, index, carr)=>{
  return pre.then(next)
 }, Promise.resolve())
}

var arr=[createPromise(2),createPromise(1),createPromise(3),createPromise(4),createPromise(5)];
// 相当于
// Promise.resolve().then(createPromise(2)).then(createPromise(1))......
serpromise(arr)

Array.prototype.reduce + async/await 版本

const reduceAsync = ( arr ) => {
 arr.reduce( async ( prev, curr ) => {
  const { rep } = await prev;
  const obj = await promise( curr, rep );
  console.log( obj );
  return obj;
 }, Promise.resolve( {} ) );
};

Array.prototype.reduce + Promise 版本

const reducePromise = ( arr ) => {
 arr.reduce( ( prev, curr ) => {
  return prev.then( data => {
   return new Promise( ( resolve, reject ) => {
    promise( curr, data.rep ).then( res => {
     console.log( res );
     resolve( res );
    } );
   } );
  } );
 }, Promise.resolve( {} ) );
};

# 执行结果
{ req: 'PM:04:49:08', rep: 'PM:04:49:11', item: 1 }
{ req: 'PM:04:49:11', rep: 'PM:04:49:14', item: 2 }
{ req: 'PM:04:49:14', rep: 'PM:04:49:17', item: 3 }
{ req: 'PM:04:49:17', rep: 'PM:04:49:20', item: 4 }

Array.prototype.map + Promise 版本

const mapPromise = ( arr ) => {
 let temporary = Promise.resolve( {} );
 arr.map( ( item, index ) => {
  temporary = temporary.then( ( data ) => {
   if (i !== 0) {
    // 第一个初始promise
    console.log( data );
   }
   return promise( item, data.rep );
  } );
 } );
 // 最后一个promise
 temporary.then( data => console.log( data ) );
};

用 map 遍历时,需要过滤初始promise的返回值,并且在遍历结束后,需手动执行最后以后一个promise,否则就会变成如下结果

# 执行结果
{}
{ req: 'PM:04:49:08', rep: 'PM:04:49:11', item: 1 }
{ req: 'PM:04:49:11', rep: 'PM:04:49:14', item: 2 }
{ req: 'PM:04:49:14', rep: 'PM:04:49:17', item: 3 }

以上结果明显不是我们所需要的,但是需要手动过滤第一个promise和执行最后一个promise,会增项不必要的代码量和出错率 后将 mapPromise 修改如下,其原理和Array.prototype.reduce+Promise版本类似

const mapPromise = ( arr ) => {
 let temporary = Promise.resolve( {} );
 arr.map( ( item, index ) => {
  temporary = temporary.then( ( data ) => {
   // if (i !== 0) {
   //  // 第一个promise
   //  console.log( data );
   // }
   return new Promise( ( resolve, reject ) => {
    promise( item, data.rep ).then( data => {
     console.log( data );
     resolve( data );
    } );
   } );
  } );
 } );
 // 最后一个promise
 // temporary.then( d => console.log( d ) );
};

其他

Array.prototype.forEach、Array.prototype.filter、Array.prototype.some、Array.prototype.every等方法和Array.prototype.map类似,就不过多赘述

以上就是JavaScript实现串行请求的示例代码的详细内容,更多关于JavaScript实现串行请求的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript判断两种格式的输入日期的正确性的代码
Mar 25 Javascript
javascript 程序库的比较(一)之DOM功能
Apr 07 Javascript
javascript复制对象使用说明
Jun 28 Javascript
Javascript排序算法之计数排序的实例
Apr 05 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
js实现点击获取验证码倒计时效果
Jan 28 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
Feb 16 Javascript
vue.js学习之UI组件开发教程
Jul 03 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
May 13 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
简述vue-cli中chainWebpack的使用方法
Jul 30 Javascript
浅谈JavaScript 声明提升
Sep 14 #Javascript
详解vue 中 scoped 样式作用域的规则
Sep 14 #Javascript
详解JavaScript 高阶函数
Sep 14 #Javascript
vue实现简单计算商品价格
Sep 14 #Javascript
Vue中添加滚动事件设置的方法详解
Sep 14 #Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 #Javascript
swiper自定义分页器的样式
Sep 14 #Javascript
You might like
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php实现简单文件下载的方法
2015/01/30 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
动态刷新 dorado树的js代码
2009/06/12 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python ftp上传文件
2016/02/13 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
使用python实现学生信息管理系统
2021/02/25 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
如何查找网页漏洞
2016/06/22 面试题
规划编制实施方案
2014/03/15 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
联谊活动总结范文
2015/05/09 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis