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

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

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了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

相关文章

  • 如何解决strict standards php报错问题
  • 带大家聊聊小程序中的几种页面传参方式
  • wordpress优化:纯代码禁止文章自动保存及修订版本的方法
  • 网页CSS字体/网页常用中英文字体(带字体预览)
  • Angular学习之以Tooltip为例了解自定义指令
  • PHP中静态方法可以访问非静态方法吗
  • thinkphp模型定义
  • Discuz!教程之删除注释云平台JS,加快Discuz访问
  • PS鼠绘精致开关按钮
  • 如何增加外链,增加外链方法汇总

文章分类

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

最近更新的内容

    • 浅析小程序中怎么让scroll-view按照指定位置滚动
    • Photoshop制作玻璃图标按钮
    • PS绘制精致陌陌图标
    • 京东图床上传接口 PHP源码
    • php使用blob存取图片的信息(含源码)
    • 随着微信支付的升级,PHP微信支付类V3接口也来了
    • WordPress“正在执行例行维护,请一分钟后回来”解决方法
    • php如何生成随机字符串并不重复
    • 聊聊Node.js中的事件驱动程序和EventEmitter类
    • 如何解决php md5生成16位出现乱码问题

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

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