gpt4 book ai didi

javascript - 向多个调用者返回相同的 Promise 是错误的吗?

转载 作者:行者123 更新时间:2023-11-29 20:54:13 25 4
gpt4 key购买 nike

我创建了一个 AngularJS 服务来处理和缓存对给定资源的请求。

一旦请求已经完成,cachedRequest() 返回 Promise.resolve(),这样任何 .then() s连接可以立即触发。

但是,如果请求未完成但已经启动,cachedRequest() 将返回它在第一次调用时创建的相同全局 Promise。 错了吗?它会造成任何内存泄漏吗?

全局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);

最佳答案

Is it wrong?

没有。缓存 promise 是一种很好的做法。

Does it create any memory leaks?

没有。当然,它会将 promise 结果保存在内存中,但这是故意的,而不是泄漏。

Once the request has already been completed, cachedRequest() returns Promise.resolve()

这完全是多余的。它应该只返回 returnPromise,就像它在请求发起后所做的那样。除了 returnPromise 之外,还存储 requestCompleted 只会让您的代码更加复杂。

关于javascript - 向多个调用者返回相同的 Promise 是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50178069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com