@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);
			
		}
		
	});
	
}


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

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

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

function test() {
  return new Promise(async (resolve) => {
    let result = null;

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

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

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

Войти через центр авторизации
Похожие вопросы