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 相关文章推荐
学习YUI.Ext 第七天--关于View&amp;JSONView
Mar 10 Javascript
jQuery阻止同类型事件小结
Apr 19 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
Nov 13 Javascript
jQuery选择器全面总结
Jan 06 Javascript
JavaScript的各种常见函数定义方法
Sep 16 Javascript
浅谈JavaScript中的对象及Promise对象的实现
Nov 15 Javascript
JavaScript File分段上传
Mar 10 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
Aug 10 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
Jun 01 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 Session变量不能传送到下一页的解决方法
2009/11/27 PHP
基于php缓存的详解
2013/05/15 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
ArrayList类(增强版)
2007/04/04 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
深入理解python对json的操作总结
2017/01/05 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
工商管理系学生的自我评价分享
2013/11/29 职场文书
个人简历自荐信
2013/12/05 职场文书
数学检讨书1000字
2014/02/24 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
营运督导岗位职责
2015/04/10 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
庆祝教师节新闻稿
2015/07/17 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL