账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    瀑布流请求了两次接口,请问怎么解决?
    • 2018-08-09 00:00
    • 10
    33
    0
    export function myList (obj, pageNumber, fn, url, query) {
      obj.panel.page.pageNumber = pageNumber
      let data
      if (query) {
        // 如果有传进来查询参数,则用传进来的参数
        console.log('------组件自带参数------')
        data = query
      } else {
        // 否则,使用默认的分页参数
        console.log('------默认分页参数------')
        obj.data = {
          'page': obj.panel.page,
          'row': {
            'host_ids': obj.hostIds,
            'hostIds': obj.hostIds
          }
        }
        data = obj.data
      }
      obj.crud.loading(obj, true)
      // 如果hostid改变了,则数据都清空,
      if (obj.lastId !== obj.hostIds) {
        obj.panel.gridData = []
        obj.n = 1
      }
      obj.getData(obj, url, data, msg => {
        // console.log(msg)
        obj.isFirst = false
        obj.startScroll = true
        let len
        // 因为返回的数据分几种情况 所以这里得多加判断
        // 首先 如果msg为真
        if (msg) {
          //再它的totalRow或者total也为真
          if (msg.totalRow >= 0) {
            len = msg.totalRow
          } else {
            len = msg.total
          }
          if (msg.length >= 0) {
            len = msg.length
          }
        } else {
          len = 0
        }
        // 设置标题总记录数
        obj.totalRow = len
        obj.total = len
        // 为了搜索和排序做的准备
        if (msg) {
          if (msg.size) {
            obj.data.size = msg.size
            // obj.data.size.beforeId = msg.size.beforeId
            // obj.data.size.offset = msg.size.offset
            obj.n = parseInt(msg.size.offset) / parseInt(obj.panel.page.pageSize)
          }
        } else {
          // 显示完页面的记录条数后,如果msg其实是undefined的,那么,直接return
          obj.crud.loading(obj, false, () => {
            obj.panel.hasData = false
            obj.reloadLock = false
          })
          return
        }
    
        // 数据处理函数
        function dataHanding (tmp) {
          // 把所有的checked设为false
          tmp.forEach(function (curr) {
            curr.checked = false
          })
          //把新拿到的数据推进gridData中去作处理
          obj.crud.loading(obj, false, o => {
            // 如果fn传进来 才执行
            if (fn) fn(msg)
            for (let entry of tmp) {
              obj.panel.gridData.push(entry)
            }
            // 给gridData加上序号
            obj.panel.gridData.map((val, i) => {
              val.myNum = i + 1
            })
            obj.$store.dispatch({type: 'changePanelData', val: obj.panel.gridData})
            obj.nowData = obj.panel.gridData
            obj.panel.hasData = true
            if (obj.panel.gridData.length === 0) obj.panel.hasData = false
          })
        }
    
        // 如果穿进来的是没list的
        if (msg.length >= 0) dataHanding(msg)
        else if (msg.list.length >= 0) dataHanding(msg.list)
        // 为瀑布流做准备
        obj.lastId = obj.hostIds
      })
    }
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • Alone[孤身一人] 普通会员 1楼

      瀑布流请求是HTTP请求的一种,它在多线程或异步环境下处理请求,每批请求之间不会阻塞,每个请求都按顺序被处理,没有顺序的重叠和重复请求。如果瀑布流请求中存在两次请求,可以考虑以下几种解决方案:

      1. 多线程处理:

        a. 使用Promise.all()方法:Promise.all()方法可以接受一个数组作为参数,返回一个新的Promise对象,该Promise对象在所有Promise对象都返回之前都被等待。在瀑布流请求中,可以创建一个Promise对象,当所有请求完成后,通过调用Promise.all()方法,将所有Promise对象的结果合并,得到处理后的结果。

      javascript Promise.all([ fetch('/api/endpoint1'), fetch('/api/endpoint2'), ]).then(results => { // 处理处理后的结果 });

      b. 使用async/await语法:在JavaScript中,async/await语法可以让你编写更加简洁和易读的异步代码。在瀑布流请求中,可以将请求封装为一个async函数,然后使用await关键字等待所有请求完成。然后,根据结果的处理逻辑来调用async函数。

      ```javascript async function瀑布流请求Handler(url) { try { const response1 = await fetch(url); const response2 = await fetch(url); // 处理处理后的结果 } catch (error) { console.error(error); } }

      瀑布流请求Handler('/api/endpoint1'); 瀑布流请求Handler('/api/endpoint2'); ```

      1. 使用async/await和await关键字:在瀑布流请求中,可以将请求封装为一个async函数,然后使用await关键字等待所有请求完成。然后,根据结果的处理逻辑来调用async函数。在瀑布流请求中,可以使用Promise.all()方法或async/await语法来实现。

      ```javascript async function瀑布流请求Handler(url) { try { const response1 = await fetch(url); const response2 = await fetch(url); const result1 = await response1.json(); const result2 = await response2.json(); // 处理处理后的结果 } catch (error) { console.error(error); } }

      async function瀑布流请求Handler(url) { try { const response1 = await fetch(url); const response2 = await fetch(url); const result1 = await response1.json(); const result2 = await response2.json(); const result3 = await await response3.json(); // 处理处理后的结果 } catch (error) { console.error(error); } }

      瀑布流请求Handler('/api/endpoint1'); 瀑布流请求Handler('/api/endpoint2'); 瀑布流请求Handler('/api/endpoint3'); ```

      1. 使用Promise.allSettled()方法:Promise.allSettled()方法返回一个Promise对象,该对象在所有Promise对象都已成功处理或失败时被调用。在瀑布流请求中,可以创建一个Promise对象,当所有请求完成后,通过调用Promise.allSettled()方法,获取所有Promise对象的解决状态,得到处理后的结果。

      javascript Promise.all([ fetch('/api/endpoint1'), fetch('/api/endpoint2'), ]).then(results => { results.forEach((response, index) => { if (index === 1) { const result1 = response.json(); console.log(result1); } else if (index === 2) { const result2 = response.json(); console.log(result2); } else { console.log('Unknown result:', response); } }); });

      以上方案的实现可以根据实际需求和业务逻辑进行选择,但都需要保证每个请求之间的异步操作顺序和处理逻辑。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部