我创建了一个AngularJS服务来处理和缓存对给定资源的请求。
请求完成后, cachedRequest()返回 Promise.resolve(),以便任何。 then() s可以立即触发连接。
但是,如果请求未完成但已启动, cachedRequest()将返回它在第一次调用时创建的相同全局Promise。 是不是错了?它是否会造成任何内存泄漏?
全局承诺的目的是同时返回请求完成之前进行的所有调用。它对我来说并没有错。
代码可以正常运行:
// 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);

答案 0 :(得分:2)
是不是错了?
没有。缓存承诺是一种很好的做法。
是否会造成任何内存泄漏?
没有。当然,它将承诺结果留在记忆中,但这不是故意泄漏。
请求完成后,
Promise.resolve()
会返回returnPromise
这完全是多余的。它应该返回自请求启动以来已经执行过的requestCompleted
。除了returnPromise
之外,存储{{1}}只会使您的代码更加复杂。