Задать вопрос
zkrvndm
@zkrvndm
Архитектор решений

Как избавиться от утечек памяти при самовызове промисов?

У меня в коде есть промисы, которые в случае неудачного завершения вызывают сами себя в условно бесконечном цикле до тех пор, пока промис не завершится успешно. Структурно все они выглядят примерно так:
Пример кода
function test() {
	
	return new Promise(async function(success) {
		
		var result = await camel(); 
		
		if (result !== false) {
			
			success(result);
			
		}
		
		else {
			
			setTimeout(async function() {
				var result = await test();
				success(result);
			}, 1000);
			
		}
		
	});
	
}


Если при нечастых вызовах все норм. то при активном использовании таких функций я заметил одну неприятность - со временем они все дольше и дольше отрабатывают, браузер становится все тормозное и тормозное, пока не падает.

Подскажите, в чем моя ошибка? Как правильно делать само вызовы промисов, чтобы это не забивало память?
  • Вопрос задан
  • 228 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
С каждым "неудачным" вызовом функции camel у вас добавляется ещё один промис, ждущий разрешения. 10 "неудачных" вызовов - 10 промисов в режиме ожидания. 1000 попыток - 1000 промисов. И т.д. Каждый съедает немного памяти.

Не нужно вам тут никакого "самовызова". Вместо рекурсии сделайте цикл:

async function test() {
  let result = null;

  do {
    result = await camel() || await new Promise(r => setTimeout(r, 1000));
  } while (!result);

  return result;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
18 дек. 2024, в 12:22
5000 руб./за проект
18 дек. 2024, в 11:57
500 руб./в час