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 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
浅析js设置控件的readonly与enabled属性问题
Dec 25 Javascript
jQuery模仿单选按钮选中效果
Jun 24 Javascript
Ionic默认的Tabs模板使用实例
Aug 29 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
Oct 09 Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 Javascript
浅谈jQuery操作类数组的工具方法
Dec 23 Javascript
javascript中的面向对象
Mar 30 Javascript
详解vue中async-await的使用误区
Dec 05 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
Apr 29 Javascript
uni-app 微信小程序授权登录的实现步骤
Feb 18 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python正则表达式常用函数总结
2017/06/24 Python
详解python运行三种方式
2019/05/13 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
大学生自我鉴定
2013/12/16 职场文书
授权委托书
2014/07/31 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
2014年组织部工作总结
2014/11/14 职场文书
2014年居委会工作总结
2014/12/09 职场文书
小学同学聚会感言
2015/07/30 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis