javascript - 基于参数的单例模式在javascript中创建promise
问题描述
我正在尝试使用单例模式来防止具有相同参数的重复网络请求。
我正在创建一个用于进行 API 调用的 Promise
如果参数相同,则返回相同的 Promise,否则创建一个新的 Promise
我将参数本地存储在单例中以检测参数的变化
下面是我的代码
var getData = (()=>{
var prev_param; //is this the correct way to store previous parameter locally
var promise_instance;
createInstance = (param)=>{
prev_param = param;
const temp_promise = this.props.dispatch(actions.getData(param)).then(getDataResult=>{
this.setState({result: getDataResult});
});
return temp_promise;
}
return (param)=>{
if (param && prev_param !== param) {
promise_instance = createInstance(param);
}
return promise_instance;
};
})();
getData("param1");
getData("param1");
getData("param2");
getData("param2");
像这样存储以前的参数是否正确
有没有更好的方法来实现这一目标?
解决方案
这是一种非常标准的记忆方法。我不确定您的需求,但我认为您可能想要使用对象或映射来存储以前的调用(除非您只想存储最后一次调用)。所以像
const getData = (()=>{
let prevParams = {}; //is this the correct way to store previous parameter locally
const createInstance = param => {
prevParams[param] = this.props.dispatch(actions.getData(param)).then(getDataResult=>{
this.setState({result: getDataResult});
});
return prevParams[param];
}
return param => {
return param && prevParams[param] || createInstance(param);
};
})();
getData("param1");
getData("param1");
getData("param2");
getData("param2");
这里的问题是 this.props 可能不会存在于上下文中,但我假设此代码已从将被调用的上下文中删除。此外,不会每次都调用 this.setState - 仅在第一次使用该参数时。具有相同参数的连续调用将传递给已解析的承诺链。如果您希望每次调用函数时都调用 setState,即使使用相同的参数,那么您可能需要移动 then 语句 - 见下文
const getData = (()=>{
let prevParams = {}; //is this the correct way to store previous parameter locally
const createInstance = param => {
prevParams[param] = this.props.dispatch(actions.getData(param));
return prevParams[param];
}
return param => {
return (param && prevParams[param] || createInstance(param))
.then(getDataResult=>{
this.setState({result: getDataResult});
});
};
})();
getData("param1");
getData("param1");
getData("param2");
getData("param2");
我对代码做了很多假设,如果有任何错误,我很抱歉:)
推荐阅读
- java - 任何用于 Soap Api 自动化测试的开源工具?
- scala - 更改scala spark中的日期格式后列的值更改
- sql - 在 JOIN 子句中使用 WHERE 时也显示空值
- python - Python:使用新键从字典输入中返回字典列表
- algorithm - 如何证明T(n)=T(n-1)+log n =Θ(nlog n)的复杂度
- javascript - 映射函数不将数据返回到渲染
- regex - 拆分字符串并在数组中获取分隔符
- facebook - Ios - Facebook 登录 - 应用程序连接中的 Facebook 浏览器无法正常工作
- r - Rmd to PDF 编译错误:Package geometry \paperwidth (0.0pt) too short
- mysql - 使用 MS Access 加快将数据从 Oracle 11 移动到 MySQL