Vue JS — Проверьте, загружены ли все элементы в массиве перед запуском функции

#javascript #vue.js #ecmascript-6 #vuejs2 #vuex

Вопрос:

У меня есть опора массива с именем trashData, и каждый элемент в этом массиве загружается в качестве пользовательского маркера на картах. Моя проблема в том, что в большинстве случаев маркеры отображаются до загрузки всех данных в «trashData». Поэтому, если у меня есть 100 элементов в «trashData», появляется только очень небольшое количество маркеров, потому что «trashData» не удалось бы загрузить все элементы в массив до создания маркеров. Что я могу сделать, чтобы все элементы в «trashData» загружались до создания маркеров? Я знаю, что можно использовать что-то вроде setTimeout, однако я не чувствую, что это очень оптимально.

TrashData является опорой в этом компоненте, и он вызывает геттеры в другом компоненте. Можно ли проверить, загрузил ли prop «trashData» все необходимые элементы из api, прежде чем запускать соответствующую функцию для создания маркеров?

Мусор.vue

 props: {
    trashData: {
      type: Array,
      required: true
    }
  },
  watch: {
    trashData: function (newValue) {
      console.log(newValue);
    }
  },
 methods: {
    createCustomOverlay: function (marker) {
      console.log("markers loaded");
      const imageUrl = this.$props.isReportedTrash ? this.getImageUrl(marker.imageUrl) : this.getImageUrl(marker.imageUrlBefore);
      let overlay = createCustomOverlay({
        imageUrl: imageUrl,
        lat: marker.location.lat,
        lng: marker.location.lon,
      });
      overlay.setMap(this.googleMap);
      return overlay;
    },

   createAndAddMarkers: function () {
      this.googleMapMarkers = this.trashData.map(marker => {
        const overlay = this.createCustomOverlay(marker);
        this.addMarkerClickListener(marker, overlay);
        return overlay;
      });
   }
}
 

TrashOverview.vue — это место, где «trashData» используется как «collectedTrash».

 computed: {
    collectedTrash: function () {
      return this.$store.getters.getCollectedTrash;
    }
  },
methods: {
    getCollectedTrash: function (page = -1, sort = TYPES_SORTING.DESC_CREATED_AT) {
      this.$store.dispatch(GET_COLLECTED_TRASH, {page: page, sort: sort});
    }
}
 

Ответ №1:

Можно ли проверить, загрузил ли prop «trashData» все необходимые элементы из api, прежде чем запускать соответствующую функцию для создания маркеров?

Вы можете использовать Promise.all() : вы отправляете все свои запросы в API в массиве обещаний, а затем ждете его с помощью Promise.all().

 const promiseN = new Promise((resolve, reject) => {
  getDataFromApi().then((result) => {
    resolve(result);
}});

Promise.all([promise1, ..., promiseN]).then((values) => {
  console.log(values);
});