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 相关文章推荐
js 未结束的字符串常量错误解决方法
Jun 13 Javascript
jQuery中使用了document和window哪些属性和方法小结
Sep 13 Javascript
js中apply方法的使用详细解析
Nov 04 Javascript
Jquery 动态生成表格示例代码
Dec 24 Javascript
JavaScript代码复用模式详解
Nov 07 Javascript
JavaScript function函数种类详解
Feb 22 Javascript
使用Angular缓存父页面数据的方法
Jan 03 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
详解AngularJS2 Http服务
Jun 26 Javascript
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
angular中不同的组件间传值与通信的方法
Nov 04 Javascript
vue+elementUI实现简单日历功能
Sep 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
PHP脚本的10个技巧(1)
2006/10/09 PHP
php 判断数组是几维数组
2013/03/20 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
js实现右键菜单功能
2016/11/28 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
详解Python中for循环的使用方法
2015/05/14 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python遍历小写英文字母的方法
2019/01/02 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
python爬虫基础知识点整理
2020/06/02 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
毕业生找工作的求职信范文
2013/12/24 职场文书
中学生获奖感言
2014/02/04 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android