JQuery实现异步同时取多个URL的json

JQuery实现异步同时取多个URL的json

问题描述:

  • 我有很多的url要去取他们返回的json值,然后组合成一个json
  • 有一个失败就全部失败
  • 全部成功则返回值组合成新JSON

问题分析

  • 很多的url假设有5个,如果1个耗时1秒,若果用同步ajax那么5个就是5秒,卡主界面,不合适
  • 那只能采用异步,简单的回调明显不合适毕竟太多,而ajax采用的是jquery,解想到了采用Promise类给他封装一下
new Promise((resolve, reject) => {
    $.ajax({
      url: "./json数据/aa.json",
      type: "get",
      dataType: "json",
      success: function (data) {
        resolve(data)
      },
      error: function (err) {
        return Promise.resolve(err)
      }
    })
  })
  • 多个Promise.all()

解决方法

 let bll = {
    getPromiseObj(param) {
      return new Promise((resolve, reject) => {
        $.ajax({
          url: param.url,
          type: "get",
          dataType: "json",
          data: param.data,
          success: function (data) {
            resolve(data)
          },
          error: function (err) {
            resolve(err)//不管成功失败都让他成功
          }
          //后边的也可以继续给加上 比如404
        })

      })
    },
    ExcutePromiseAll: function (arr, callBackFunc) {//还是得回调一下 将结果输出
      let arrparam = []
      arr.forEach(a => {
        arrparam.push(bll.getPromiseObj(a))
      })

      Promise.all(arrparam).then(data => {
        let result = { err: "" };
        arr.forEach((v, i) => {
          result[v.name] = data[i]
        })
        callBackFunc(result)

      }).catch(err => {
        callBackFunc({ err: err })
      })
    }
  }
  //2.声明一个数组 存放最终js的属性和url及参数
  let arrResultDic = [{
    name: "jsonpro1",
    url: "./json数据/aa.json",
    data: {}

  }, {
    name: "jsonpro2",
    url: "./json数据/bb.json",
    data: {}
  }, {
    name: "jsonpro3",
    url: "./json数据/cc.json",
    data: {}
  }]

  //3调用一下
  bll.ExcutePromiseAll(arrResultDic, data => {
    console.log("结果:", data)
  })

在这里插入图片描述

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用jQuery的Deferred对象和when()方法来实现多个请求合并到一个数据里面。 首先,我们可以使用jQuery的$.ajax()方法发送多个请求,每个请求都返回一个Deferred对象,表示请求的异步操作。 然后,我们可以使用$.when()方法来等待所有的异步操作都完成。$.when()方法接受多个Deferred对象作为参数,当所有Deferred对象都执行完成时,它会返回一个新的Deferred对象。 最后,我们可以在$.when()方法的回调函数中,获每个请求的返回数据,再将它们合并到一个数据里面。 以下是一个示例代码: ```javascript var deferred1 = $.ajax({ url: 'url1', dataType: 'json' }); var deferred2 = $.ajax({ url: 'url2', dataType: 'json' }); var deferred3 = $.ajax({ url: 'url3', dataType: 'json' }); $.when(deferred1, deferred2, deferred3).done(function(result1, result2, result3) { // 将三个请求的返回数据合并到一个数据里面 var data = $.extend({}, result1[0], result2[0], result3[0]); console.log(data); }); ``` 在上面的代码中,我们发送了三个请求,分别是'url1'、'url2'和'url3',每个请求返回一个Deferred对象。 然后,我们使用$.when()方法等待三个请求都完成,当它们都完成时,执行回调函数。在回调函数中,我们使用$.extend()方法将三个请求的返回数据合并到一个数据里面,并输出到控制台上。 注意,使用$.when()方法等待多个异步操作时,它们的执行顺序是不确定的。因此,在合并返回数据时,需要注意返回数据的格式和字段名称是否一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值