循环内调用ajax接口只调用一次的问题

最近做开发有个功能:从数据库读取十条记录,然后for循环这十条记录,用每条记录中的一个属性再去阿里云上去查询图片地址,

先期直接尝试:

getLast10EventList=async ()=>{
  const { data, isError } = await api.get( `${window.reqPrefix}/nds/getLast10EventList` )
  if ( !isError && data ) {
     data.data.map((item)=>{
       const ali_url = this.getPngUrlByAli(item.evt_image_url)
       item.ali_url = ali_url 
     })
    this.setState({eventList:data.data})
  }
}
getPngUrlByAli=async(evtImageUrl)=>{
  const { isError, data } = await api.get(
    `${reqPrefix}/evtDetail/getOssVideoImgUrl`, {
      videoImgUrl: evtImageUrl
    } );
  if ( data && data.success ) {
    return data.resultUrl
  }
}

上面代码看着简单没毛病,但是data.data.map()这个循环里只会调用this.getPngUrlByAli(item.evt_image_url)这个接口一次,看入参是遍历数据的最后一次,在getPngUrlByAli()方法里打印日志,发现调用的次数没问题,只会是异步导致的,调用太快导致前面的九次调用都忽略了,只有最后一次返回,那改为同步ajax调用就行了

getLast10EventList=async ()=>{
  const { data, isError } = await api.get( `${window.reqPrefix}/nds/getLast10EventList` )
  if ( !isError && data ) {
    if(window.getShortVideoFromAliFlag==='true'){//图片地址需要从阿里获取
      var xmlHttp = this.creatXMLHttpRequest();
      data.data.map((item)=>{
        xmlHttp.onreadystatechange = function() {
          if (xmlHttp.readyState == 4) {
            if (xmlHttp.status == 200) {
              var result = xmlHttp.responseText
              item.img_url_ali = JSON.parse(result).resultUrl
            }
          }
        }
        xmlHttp.open("GET", `${reqPrefix}/evtDetail/getOssVideoImgUrl?videoImgUrl=`+item.evt_image_url, false);
        xmlHttp.send(null);

      })
    }
    this.setState({eventList:data.data})
  }
}
creatXMLHttpRequest=()=> {
  var xmlHttp;
  if (window.ActiveXObject) {
    return xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  } else if (window.XMLHttpRequest) {
    return xmlHttp = new XMLHttpRequest();
  }
}

亲测可用,希望能帮到你~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值