@danilr

Почему promise не срабатывает?

консоль лог срабатывает сразу
setMarkers(rcs) {
			new Promise((resolve, reject) => {
				rcs.forEach((residential, i) => {
					setTimeout(() => {
						let myDivIcon = DG.divIcon({
							iconSize: [30, 30],
							className: "marker-custom",
							html: this.setMiniMarker(residential)
						});

						this.popupMap = DG.popup({
							className: "test-name",
							closeButton: false,
							offset: DG.point(0, 1),
							setZoomMarker: false
						}).setContent(this.setPopupMarker(residential));

						this.coordinates = [residential.latitude, residential.longitude];
						DG.marker(this.coordinates, { icon: myDivIcon })
							.addTo(this.markers)
							.bindPopup(this.popupMap);
					}, i * 50);
				});
				resolve("промис");
			})
				.then(response => {
					console.log(response);
					this.markers.addTo(this.map);

					this.map.fitBounds(this.markers.getBounds());

					this.markers.on("click", event => {
						//при наведении.mouseover, click на маркер
						if (event.originalEvent.target.closest("[data-id]")) {
							let residentialId = Number(
								event.originalEvent.target.closest("[data-id]").dataset.id
							);
							this.setResidentialId(residentialId);

							// добавление класса с задержкой для ожидания создания данных
							if (this.countFunctionMarker === 0) {
								setTimeout(() => (this.isOpenRc = true), 200);
							} else {
								this.isOpenRc = true;
							}
							this.countFunctionMarker++;
						}
					});
				})
				.catch(error => {
					console.error(error);
				});
		},
  • Вопрос задан
  • 260 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Всё срабатывает. "Не срабатывает" и "срабатывает не так, как я задумал" - это не одно и то же. Промис должен резолвиться по таймауту, а не сразу; на каждый таймаут должен быть свой промис.

А чтобы выполнить какие-то действия после всех таймаутов, засуньте промисы в Promise.all:

Promise.all(rcs.map((residential, i) => {
  return new Promise(resolve => {
    setTimeout(() => {
      ...
      resolve();
    }, i * 50);
  });
}).then(() => {
  ...
});

Или сделайте метод асинхронным, и используйте await:

async setMarkers(rcs) {
  for (const residential of rcs) {
    await new Promise(resolve => setTimeout(resolve, 50));
    ...
  }
  ...
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
17 апр. 2024, в 00:48
35000 руб./за проект
17 апр. 2024, в 00:13
800 руб./за проект
17 апр. 2024, в 00:06
240000 руб./за проект