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 相关文章推荐
juqery 学习之四 筛选过滤
Nov 30 Javascript
使用Firebug对js进行断点调试的图文方法
Apr 02 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
Oct 14 Javascript
jquery队列queue与原生模仿其实现方法分享
Mar 25 Javascript
javascript自定义函数参数传递为字符串格式
Jul 29 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
Oct 10 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
Feb 22 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
Apr 25 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
微信小程序左滑删除实现代码实例
Sep 16 Javascript
小程序实现简单语音聊天的示例代码
Jul 24 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
一个取得文件扩展名的函数
2006/10/09 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
JavaScript实现把数字转换成中文
2015/06/29 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
JS/CSS实现字符串单词首字母大写功能
2019/09/03 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python使用sftp实现上传和下载功能(实例代码)
2017/03/14 Python
Python实现类的创建与使用方法示例
2017/07/25 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
python读文件的步骤
2019/10/08 Python
使用python制作一个解压缩软件
2019/11/13 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
Java基础知识面试题
2014/03/25 面试题
销售员岗位职责范本
2014/02/03 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
欠款证明
2015/06/24 职场文书