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 相关文章推荐
删除重复数据的算法
Nov 23 Javascript
利用js跨页面保存变量做菜单的方法
Jan 17 Javascript
JQuery里选择超链接的实现代码
May 22 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
May 17 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
Aug 11 Javascript
js表单登陆验证示例
Oct 19 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
Feb 28 Javascript
javascript简单写的判断电话号码实例
May 24 Javascript
详解JavaScript添加给定的标签选项
Sep 17 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
Jul 08 Javascript
vue中实现上传文件给后台实例详解
Aug 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
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
javascript for循环设法提高性能
2010/02/24 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
自我鉴定范文300字
2013/10/01 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
《画家乡》教学反思
2014/04/22 职场文书
企业人事任命书
2014/06/05 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
Python实现制作销售数据可视化看板详解
2021/11/27 Python
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS
Win11查看设备管理器
2022/04/19 数码科技
Android存储中最基本的文件存储方式
2022/04/30 Java/Android