javascript - 向多个调用者返回相同的 Promise 是否错误?
问题描述
我创建了一个 AngularJS 服务来处理和缓存对给定资源的请求。
一旦请求已经完成,cachedRequest()返回Promise.resolve(),因此任何 . then()的连接可以立即触发。
但是,如果请求没有完成,但已经启动,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);
解决方案
这是错的吗?
不会。缓存 promise 是一种很好的做法。
它会造成任何内存泄漏吗?
不。当然,它会将承诺结果保存在内存中,但这是故意的,而不是泄漏。
一旦请求已经完成,
cachedRequest()
返回Promise.resolve()
这完全是多余的。它应该只返回returnPromise
自请求启动以来已经执行的操作。存储requestCompleted
除了returnPromise
just 会使您的代码更加复杂。
推荐阅读
- azure-devops - 关闭拉取请求而不将其合并到 Azure DevOps 中的上游分支
- html - 如何将离子日期时间中的开始时间和结束时间分开 30 分钟
- javascript - 使用 Google 地球引擎计算每个地区、月份和年份的 NDVI?- 跟进问题
- node.js - Nextjs:现在运行时抛出错误
- javascript - Jquery keypress 事件,event.keycode 或 event.which 在 android 中始终为 0
- javascript - VueJS:如何在移动尺寸上隐藏一些数据表列
- c# - Unity C# 中的 Toast 消息
- javascript - 如何计算两个日期之间的天数,不包括angularjs中的周末?
- angular - 如果发生令牌还活着,则在 auth gurd 函数中销毁所有组件
- php - 1242 - 子查询返回多于 1 行,怎么了?