• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > JavaScript如何处理并行请求?四种方式浅析

JavaScript如何处理并行请求?四种方式浅析

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了JavaScript,处理并行请求等相关知识,希望对您有所帮助

本篇文章和大家看看JavaScript如何处理并行请求?介绍一下JS处理并行请求的四种方式,希望对大家有所帮助!


JavaScript如何处理并行请求?四种方式浅析


需求

两个异步请求同时发出,两个请求都返回时再做处理

实现

这里的方法仅提供思路,只做请求成功处理


方法一

使用Promise.all

const startTime = new Date().getTime()function request(time) {  return new Promise(resolve => {    setTimeout(() => {      resolve(time)    }, time)  })}let request1 = request(3000)let request2 = request(2000)Promise.all([request1, request2]).then(res => {  console.log(res, new Date() - startTime)  // [ 3000, 2000 ] 3001})


方法二

自定义状态,在回调中判断返回状态,待2个请求都有返回值时再做处理

const startTime = new Date().getTime()function request(time) {  return new Promise(resolve => {    setTimeout(() => {      resolve(time)    }, time)  })}let state = [undefined, undefined]let request1 = request(3000)let request2 = request(2000)request1.then(res => {  state[0] = res  process()})request2.then(res => {  state[1] = res  process()})function process() {  if (state[0] && state[1]) {    console.log(state, new Date() - startTime) // [ 3000, 2000 ] 3001  }}


方法三

generator,yield

const startTime = new Date().getTime()function ajax(time, cb) {  setTimeout(() => cb(time), time)}function request(time) {  ajax(time, data => {    it.next(data);  })}function* main() {  let request1 = request(3000);  let request2 = request(2000);  let res1 = yield request1  let res2 = yield request2  console.log(res1, res2, new Date() - startTime) // 2000 3000 3001}let it = main();it.next();

这个地方有点问题,因为request2耗时较短,会先返回,也就是先执行it.next(2000),导致res1获得了request2的返回值若使用co函数,则不会存在这个问题,因为co是在promise.then函数中才执行it.next(),相当于it.next()是链式调用


generator使用co函数

const co = require('co')const startTime = new Date().getTime()function request (time) {  return new Promise(resolve => {    setTimeout(() => {      resolve(time)    }, time)  })}co(function* () {  let request1 = request(3000);  let request2 = request(2000);  let res1 = yield request1  let res2 = yield request2  console.log(res1, res2, new Date() - startTime) // 3000 2000 3001})

有了co函数,就不需要生成it和执行next方法了; co的原理其实也简单,就是递归执行next,直到done为true; 如果next返回的value是Promise,则在then函数中执行next,若不是Promise,直接执行next函数 下面是co函数的简版手写实现

function co(func) {  let it = func()  let t = it.next()  next()     function next() {    if (t.done) return    if (t.value instanceof Promise) {      t.value.then(res => {        t = it.next(res)        next()      })    } else {      t = it.next(t.value)      next()    }  }}


方法四

有了generator,很容易想到async/await,毕竟async/await就是由generator实现的

// setTimeout模拟异步请求,time为请求耗时const startTime = new Date().getTime()function request (time) {  return new Promise(resolve => {    setTimeout(() => {      resolve(time)    }, time)  })}(async function () {  let request1 = request(3000)  let request2 = request(2000)  let res1 = await request1  console.log(res1, new Date() - startTime) // 3000 3001  let res2 = await request2  console.log(res2, new Date() - startTime) // 2000 3005})()


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 一起来聊聊JavaScript函数柯里化
  • 在javascript中,NaN是什么类型?
  • javascript调试之console.table()
  • Javascript中常见的内置对象有哪些
  • Javascript怎么实现字符串替换星号
  • 解决JavaScript中数组排序sort不发生改变
  • Javascript怎么实现红绿灯
  • 两行 Javascript 代码生成 UUID的方法
  • Javascript怎么实现四位随机验证码
  • javascript怎么判断是否为null

相关文章

  • 2022-04-2910个超级有用的PHP代码片段(建议收藏)
  • 2022-04-29手把手带你在小程序中实现保存图片组件功能
  • 2022-04-29关键词组合的SEO优化策略
  • 2022-04-29WordPress建站教程,纯代码实现wordpress防止发布文章出现标题重复,自动检测重复标题文章
  • 2022-04-29phpMyadmin该怎么实现root账户外部访问
  • 2022-04-29Docker基础之compose文件结构以及安装工具
  • 2022-04-29Discuz论坛更换域名,详细文件修改步骤
  • 2022-04-29css中实现背景透明的三种方式
  • 2022-04-29Illustrator使用混合和透明度制作发光按钮
  • 2022-04-29PHPCMS V9静态化HTML生成设置及URL规则优化

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 如何解决php微信输出乱码
    • 15个值得收藏的实用JavaScript代码片段(项目必备)
    • 利用curl函数抓取网站数据,仿造IP+伪造来源+防屏蔽
    • PHP中$_SESSION获取不到值怎么办
    • 百度统计升级屏蔽黑灰产信息功能
    • 详解Bootstrap中的图片轮播--Carousel插件
    • array_values()在php中返回数组的操作实例
    • 浅谈小程序中页面间传值的2种方法
    • 宝塔面板删除网站根目录后自动重建的解决办法
    • Bootstrap模态窗中如何从远程加载内容?remote方法介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有