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之dhDataGrid Ver2.0.0代码
Jul 01 Javascript
jQuery ctrl+Enter shift+Enter实现代码
Feb 07 Javascript
禁止js文件缓存的代码
Apr 09 Javascript
jquery的flexigrid无法显示数据提示获取到数据
Jul 19 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
May 28 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
解决vue props 拿不到值的问题
Sep 11 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
Vue 动态组件与 v-once 指令的实现
Feb 12 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
js实现小时钟效果
Mar 25 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
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php操作MongoDB类实例
2015/06/17 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
js实现图片轮播效果
2015/12/19 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
easyUI combobox实现联动效果
2017/01/17 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
js实现打字小游戏
2019/12/17 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
Python2.x中文乱码问题解决方法
2015/06/02 Python
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
C语言中break与continue的区别
2012/07/12 面试题
类成员函数的重载、覆盖和隐藏区别
2016/01/27 面试题
大学同学聚会邀请函
2014/01/19 职场文书
英语生日邀请函
2014/01/23 职场文书
中学生学雷锋演讲稿
2014/04/26 职场文书
搞笑爱情保证书
2014/04/29 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js
Python实现双向链表
2022/05/25 Python