vue3中异步变同步的方式以及注意点

news/2024/7/10 2:49:57 标签: vue, 百度, javascript

1、在前端对接实际开发中,会遇到异步的后端接口,在调用改接口给变量赋值时会遇到执行回调的问题,即接口还未返回数据,就以及取加载渲染其他元素或者组件了,但是无数据可显示,

比如,今天在开发百度地图点击显示弹窗时,弹窗出来的是旧值或者会出现无绑定数据的问题

map.addEventListener("click", handleClick);

  function handleClick(e) {

    //关闭弹窗

    map.removeOverlay(label);

    var gc = new BMapGL.Geocoder(); //创建一个地址解析器的实例

    var data = e.latlng;

    gc.getLocation(data, function (rs) {

      console.log(rs);

      var addComp = rs.addressComponents;

      // 城市名  带市

      var cityName1 = addComp.city;

      // 城市名  不带市

      cityClickName = addComp.city.slice(0, addComp.city.length - 1);

      cityName.value = addComp.city.slice(0, addComp.city.length - 1);

      // 城市编码

      var cityCode = parseInt(rs.content.address_detail.adcode / 100) * 100;

      console.log(cityCode, "编码");

      params1.value.city = cityCode;

      getPolicy();

      queryParams.value.city = cityName1;

      initChartsHandle();

      queryParams1.value.CityName = cityClickName;

      queryParams1.value.IsQueryCity = "true";

      getIndustryList();

     

        let content= getCilckedData();//这样写是不糊等待返回结果的,直接往下执行了

        point = new BMapGL.Point(e.latlng.lng, e.latlng.lat);

        label = new BMapGL.Label(content, {

          // 创建文本标注

          position: point, // 设置标注的地理位置

          offset: new BMapGL.Size(10, 20), // 设置标注的偏移量

        });

        label.setStyle({

          color: "#000",

          border: "0px",

          backgroundColor: "0.000000000001",

          fontSize: "12px",

          height: "20px",

          lineHeight: "20px",

        });

        label.setPosition(point);

        map.addOverlay(label);

    });

    // var new_point = new BMapGL.Point(e.point.lng, e.point.lat);

    // var new_mk = new BMapGL.Marker(point);

    // map.addOverlay(new_mk);

    // map.panTo(point);

    /** 不要删这里代码 383-399 */

    /** 获取点击的位置信息 */

    /* let gc = new BMapGL.Geocoder();

    gc.getLocation(point, function (rs) {

      // console.log(dist._opts.districts = rs.addressComponents.city,'dist//');

      const dist = new BMapGL.DistrictLayer({

        // name: `(安阳,鹤壁,濮阳,新乡,焦作,郑州,开封,商丘,周口,驻马店,信阳,南阳,三门峡,洛阳,平顶山,许昌)`,

        name: `(${rs.addressComponents.city})`,

        kind: 1,

        fillColor: "#0E94D7",

        fillOpacity: 0.18,

        strokeColor: "#0E94D7",

        viewport: true,

      });

      map.addDistrictLayer(dist);

    });*/

  }

 正确方式是,在调用异步方法时也加上一样的async和await,如下:

const cityDataList = ref([]);

async function getCilckedData() {
  let res = await getMapData(cityName.value);
  // nextTick(() => {
  //   // console.log(cityName.value, res, "点击数据");
  //   cityDataList.value = showContent(res);
  //   // console.log(cityDataList.value, 111111);
  // });

  let result=showContent(res);
  return result;
}


const initMap = () => {
  const map = new BMapGL.Map("myMap");
  let label = new BMapGL.Label(null);
  let x = 113.63277458020903;
  let y = 34.749066496168886;
  let point = new BMapGL.Point(x, y); // 选择一个经纬度作为中心点
  map.centerAndZoom(point, 14); // 设置地图中心点和缩放级别
  map.enableScrollWheelZoom(true);
  /**样式*/
  const MapKey = "eb60ff7d9d27c608a5b5e1af1ec52c34";
  map.setMapStyleV2({
    styleId: MapKey,
  });

  /** 创建聚合行政图层 */
  const dist = new BMapGL.DistrictLayer({
    // name: `(安阳,鹤壁,濮阳,新乡,焦作,郑州,开封,商丘,周口,驻马店,信阳,南阳,三门峡,洛阳,平顶山,许昌)`,
    name: `(河南省)`,
    kind: 1,
    fillColor: "#0E94D7",
    fillOpacity: 0.18,
    strokeColor: "#0E94D7",
    viewport: true,
  });
  map.addDistrictLayer(dist);

  //dist.addEventListener("click", handleClick);//使用此方法会导致触发两次点击事件
  map.addEventListener("click", handleClick);

  function handleClick(e) {

    //关闭弹窗
    map.removeOverlay(label);
    var gc = new BMapGL.Geocoder(); //创建一个地址解析器的实例
    var data = e.latlng;
    gc.getLocation(data, function (rs) {
      console.log(rs);
      var addComp = rs.addressComponents;
      // 城市名  带市
      var cityName1 = addComp.city;
      // 城市名  不带市
      cityClickName = addComp.city.slice(0, addComp.city.length - 1);
      cityName.value = addComp.city.slice(0, addComp.city.length - 1);
      // 城市编码
      var cityCode = parseInt(rs.content.address_detail.adcode / 100) * 100;
      console.log(cityCode, "编码");
      params1.value.city = cityCode;
      getPolicy();
      queryParams.value.city = cityName1;
      initChartsHandle();
      queryParams1.value.CityName = cityClickName;
      queryParams1.value.IsQueryCity = "true";
      getIndustryList();
      nextTick(async()=>{ //必须加上async和await否则会走异步,出现还未获取到数据就去加载地图label组件函数了
        let content= await getCilckedData();

        point = new BMapGL.Point(e.latlng.lng, e.latlng.lat);
        label = new BMapGL.Label(content, {
          // 创建文本标注
          position: point, // 设置标注的地理位置
          offset: new BMapGL.Size(10, 20), // 设置标注的偏移量
        });

        label.setStyle({
          color: "#000",
          border: "0px",
          backgroundColor: "0.000000000001",
          fontSize: "12px",
          height: "20px",
          lineHeight: "20px",
        });
        label.setPosition(point);
        map.addOverlay(label);
      })
      // var area = addComp.district;
      // alert(province + ":" + city + ":" + area);

      //e.currentTarget.setFillColor("#9169db");
    });

    // var new_point = new BMapGL.Point(e.point.lng, e.point.lat);
    // var new_mk = new BMapGL.Marker(point);
    // map.addOverlay(new_mk);
    // map.panTo(point);

    /** 不要删这里代码 383-399 */

    /** 获取点击的位置信息 */
    /* let gc = new BMapGL.Geocoder();
    gc.getLocation(point, function (rs) {
      // console.log(dist._opts.districts = rs.addressComponents.city,'dist//');
      const dist = new BMapGL.DistrictLayer({
        // name: `(安阳,鹤壁,濮阳,新乡,焦作,郑州,开封,商丘,周口,驻马店,信阳,南阳,三门峡,洛阳,平顶山,许昌)`,
        name: `(${rs.addressComponents.city})`,
        kind: 1,
        fillColor: "#0E94D7",
        fillOpacity: 0.18,
        strokeColor: "#0E94D7",
        viewport: true,
      });
      map.addDistrictLayer(dist);
    });*/
  }

  // dist.addEventListener("mouseout", function (e) {
  //   point = new BMapGL.Point(e.latLng.lng, e.latLng.lat);
  //   // map.removeOverlay(label);
  //   e.currentTarget.setFillColor(e.currentTarget.style.fillColor);
  // });
};

总结:

解决方式就是都加上async和await,不管是请求接口的方法,还是获取请求接口方发的接口时候

即上面的请求接口的方法getCilckedData()

以及获取结果赋值的 let content= await getCilckedData();


http://www.niftyadmin.cn/n/5124887.html

相关文章

User CSS 在性能优化方面的实践

目录 前言 1. 减少重绘和回流 1.1 用法 1.2 代码示例 1.3 理解 2. 使用CSS精灵 2.1 用法 2.2 代码示例 2.3 理解 3. 压缩CSS文件 3.1 用法 3.2 代码示例 3.3 理解 4. 使用媒体查询进行响应式设计 4.1 用法 4.2 代码示例 4.3 理解 5. 使用CSS预处理器和构建工…

举个栗子!Quick BI 技巧(3):创建趋势分析表

上一期举个栗子为数据粉们分享了如何简单几步创建柱线图,有一些数据想了解如何在 Quick BI 中制作趋势分析表。 趋势分析表由趋势分析图和趋势分析明细表组成,可以通过趋势分析图查看指标的宏观趋势,通过趋势分析表查看指标详情,…

CBAM:卷积注意力机制

文章目录 CBAM结构Channel attention moduleSpatial attention moduleArrangement of attention modules对比实验ablation对比实验通道注意力的avgpooling vs. maxpoolingSpatial attention对比实验Arrangement of the channel and spatial attention数据集验证ImageNet-1K可视…

Spring框架的发展历程

Spring框架的发展历程 自2004年以来,Spring框架已经成为Java开发人员最受欢迎的开源框架之一。它提供了一个全面的编程和配置模型,旨在简化企业级Java应用程序的开发过程。本文将详细介绍Spring框架的发展历程,以及它如何为Java开发人员提供…

vue3 code format bug

vue code format bug vue客户端代码格式化缺陷,为了方便阅读和维护,对代码格式化发现这个缺陷 vue.global.min.3.2.26.js var Vuefunction(r){"use strict";function e(e,t){const nObject.create(null);var re.split(",");for(le…

淘宝API接口获取商品信息,订单管理,库存管理,数据分析

在淘宝开放平台中,每个API接口都有相应的文档说明和授权机制,以确保数据的安全性和可靠性。开发者可以根据自己的需求选择相应的API接口,并根据文档说明进行调用和使用。 淘宝开放平台API接口是一套REST方式的开放应用程序编程接口&…

Pytest框架环境切换实战教程

测试人员每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,那么今天小编就给大家聊一下,如何能让我们python…

Python 训练集、测试集以及验证集切分方法:sklearn及手动切分

目录 方法一 方法二 需求目的:针对模型训练输入,按照6:2:2的比例进行训练集、测试集和验证集的划分。当前数据量约10万条。如果针对的是记录条数达上百万的数据集,可按照98:1:1的比例进行切分。 方法一:切分训练集和测试集&…