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 类
Nov 07 Javascript
jQuery的三种$()
Dec 30 Javascript
Javascript实现飞动广告效果的方法
May 25 Javascript
jQuery Dialog对话框事件用法实例分析
May 10 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
jquery精度计算代码 jquery指定精确小数位
Feb 06 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
jQuery plugin animsition使用小结
Sep 14 jQuery
javascript input输入框模糊提示功能的实现
Sep 25 Javascript
基于vue配置axios的方法步骤
Nov 09 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
Jan 25 Javascript
vue页面跳转实现页面缓存操作
Jul 22 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 安装配置方法和问题解决
2009/06/08 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP错误处理函数
2016/04/03 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
Prototype Selector对象学习
2009/07/23 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python实现的简单算术游戏实例
2015/05/26 Python
python如何通过protobuf实现rpc
2016/03/06 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python代码编写计算器小程序
2020/03/30 Python
解析Python3中的Import
2019/10/13 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
python新手学习使用库
2020/06/11 Python
详细分析Python垃圾回收机制
2020/07/01 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
银行自荐信范文
2013/10/07 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
销售员试用期自我评价
2014/09/15 职场文书
用人单位聘用意向书
2015/05/11 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书