Я создал службу 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);