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 相关文章推荐
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
Oct 16 Javascript
jQuery+css实现百度百科的页面导航效果
Dec 16 Javascript
详解JavaScript基于面向对象之继承实例
Dec 16 Javascript
json的使用小结
Jun 08 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
JavaScript字符串对象
Jan 14 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
在Vue环境下利用worker运行interval计时器的步骤
Aug 01 Javascript
JavaScript实现随机点名程序
Mar 25 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 Javascript
JavaScript实现打字游戏
Feb 19 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概述.
2006/10/09 PHP
PHP 高手之路(一)
2006/10/09 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
PHP crypt()函数的用法讲解
2019/02/15 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python中的自省(反射)详解
2015/06/02 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
Python实现购物车程序
2018/04/16 Python
python构建基础的爬虫教学
2018/12/23 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Python何时应该使用Lambda函数
2019/07/02 Python
python 实现控制鼠标键盘
2020/11/27 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
财产保全担保书范文
2014/04/01 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技