向多个调用者返回相同的 Promise 是错误的吗?
Is returning the same Promise to multiple callers wrong?
我创建了一个 AngularJS 服务来处理和缓存对给定资源的请求。
一旦请求已经完成,cachedRequest() returns Promise.resolve(),这样任何 .then() 连接都可以立即触发。
然而,如果请求没有完成,但已经启动,cachedRequest()return是它在第一次调用时创建的同一个全局 Promise。 有错吗?它会造成任何内存泄漏吗?
全局 Promise 的目的是 return 同时对请求完成之前进行的所有调用。我觉得没问题。
代码运行无误:
// 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);
Is it wrong?
没有。缓存承诺是一种很好的做法。
Does it create any memory leaks?
没有。当然,它会将承诺结果保存在内存中,但这是故意的,而不是泄漏。
Once the request has already been completed, cachedRequest()
returns Promise.resolve()
这完全是多余的。它应该只是 return returnPromise
就像自请求发起以来已经做的那样。除了 returnPromise
之外还存储 requestCompleted
只会使您的代码更加复杂。
我创建了一个 AngularJS 服务来处理和缓存对给定资源的请求。
一旦请求已经完成,cachedRequest() returns Promise.resolve(),这样任何 .then() 连接都可以立即触发。
然而,如果请求没有完成,但已经启动,cachedRequest()return是它在第一次调用时创建的同一个全局 Promise。 有错吗?它会造成任何内存泄漏吗?
全局 Promise 的目的是 return 同时对请求完成之前进行的所有调用。我觉得没问题。
代码运行无误:
// 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);
Is it wrong?
没有。缓存承诺是一种很好的做法。
Does it create any memory leaks?
没有。当然,它会将承诺结果保存在内存中,但这是故意的,而不是泄漏。
Once the request has already been completed,
cachedRequest()
returnsPromise.resolve()
这完全是多余的。它应该只是 return returnPromise
就像自请求发起以来已经做的那样。除了 returnPromise
之外还存储 requestCompleted
只会使您的代码更加复杂。