zkrvndm
@zkrvndm
Архитектор решений

Как сделать так, чтобы одновременно могло работать не более одного экземпляра функции?

Хочу, чтобы все последующие запуски функции давал результат самого первого запуска, но только в том случае если функция уже запущена и сейчас работает. То есть если есть работающий сейчас экземпляр функции мы не вызываем функцию снова, а просто берем результат этого самого работающего экземпляра, когда он (результат) будет готов.

Мой вариант с использованием глобалки и промисов:
Пример
function test() {
	
	if (typeof test_promise == 'undefined') {
		
		test_promise = new Promise(function(returnPromiseResult) {
			
			setTimeout(function() {
				
				test_promise = undefined;
				returnPromiseResult(new Date().getTime());
				
			}, 5000);
			
		});
		
		return test_promise;
		
	}
	
	else {
		
		return test_promise;
		
	}
	
}

Но может есть способы получше?
  • Вопрос задан
  • 120 просмотров
Решения вопроса 3
hahenty
@hahenty
('•')
Вы чо ребята?! Это же debounce с кешем результата.
Ответ написан
@YahorDanchanka
Frontend developer
Создайте класс и используйте паттерн Singleton.
Можно, конечно, реализовать и функцию, но способы достаточно костыльные. Правильное решение - класс с реализованным паттерном.
Реализация функции, только нужно запомнить состояние самого 1 вызова функции:
var something = (function() {
    var executed = false;
    return function() {
        if (!executed) {
            executed = true;
            // do something
        }
    };
})();
something(); // "do something" happens
something(); // nothing happens
Ответ написан
Seasle
@Seasle Куратор тега JavaScript
Речь о чём-то похожем?
const singleBusinessLogic = (() => {
  let isBusy = false;
  let promise = null;
  let done = null;
  let failure = null;
  
  return (id) => {
    if (!isBusy) {
      isBusy = true;
      promise = new Promise((resolve, reject) => ([done, failure] = [resolve, reject]));
      
      fetch(`https://jsonplaceholder.typicode.com/users/${id}`)
        .then(response => response.json())
        .then(done)
        .catch(failure)
        .finally(() => (isBusy = false));
    }
    
    return promise;
  };
})();

(async () => {
  console.log(await singleBusinessLogic(1)); // { ..., name: 'Leanne Graham', ... }
  console.log(await singleBusinessLogic(2)); // { ..., name: 'Leanne Graham', ... }
  setTimeout(async () => {
    console.log(await singleBusinessLogic(3)); // { ..., name: 'Clementine Bauch', ... }
    console.log(await singleBusinessLogic(4)); // { ..., name: 'Clementine Bauch', ... }
  });
})();

Или хотите возвращать результат только самого первого вызова?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы