Верно ли возвращать одно и то же обещание нескольким абонентам - PullRequest
0 голосов
/ 04 мая 2018

Я создал службу AngularJS для обработки и кэширования запросов к данному ресурсу.

Как только запрос уже завершен, cachedRequest () возвращает Promise.resolve () , так что любой. then () s может быть подключен немедленно срабатывает.

Однако, если запрос не завершен, но уже инициирован, cachedRequest () возвращает то же глобальное обещание, которое он создал при первом вызове. Это неправильно? Это создает какие-либо утечки памяти?

Целью глобального Обещания является возврат ко всем вызовам, сделанным до завершения запроса одновременно. Это не выглядит неправильно для меня.

Код работает без ошибок:

// The request function which should only be called once
function request(callback) { console.log("Doing stuff only once..."); setTimeout(callback, 5000); }

// Holds global request status (completed/not completed)
var requestCompleted = false;
// Holds global promise
var returnPromise = null;

// The interface for the request function
function cachedRequest() {

  // Request results already available
  // Returning Promise.resolve() to trigger .then()s
  if(requestCompleted){
    return Promise.resolve(requestCompleted);

  // Request result not available (not initiated or not completed)
  }else{
    // Request was initiated
    if(returnPromise){
      // IS THIS WRONG?
      return returnPromise;
    
    // Request not initiated
    }else{
      // Creates and stores the promise 
      returnPromise = new Promise(function (resolve, reject) {
        request(function () {
          requestCompleted = true;
          resolve(requestCompleted);
        });
      });
      // Returns the promise
      return returnPromise;
    }
  }
}


/////////////////

function doRequestAndPrint(n) {
  console.log("Request " + n);
  cachedRequest()
    .then((value)=>{
      console.log("Returned " + n);
    })
}

//////////////////////////////

doRequestAndPrint(1);

setTimeout(()=>{doRequestAndPrint(2)}, 2000);

setTimeout(()=>{doRequestAndPrint(3)}, 10000);

1 Ответ

0 голосов
/ 04 мая 2018

Это неправильно?

Нет. Кэширование обещаний - хорошая практика.

Создает ли утечка памяти?

Нет. Конечно, он сохраняет обещанный результат в памяти, но это не утечка.

Как только запрос уже выполнен, cachedRequest() возвращает Promise.resolve()

Это совершенно лишнее. Он должен просто вернуть returnPromise, как это уже было сделано с момента инициации запроса. Хранение requestCompleted в дополнение к returnPromise только усложняет ваш код.

...