Javascript 如何在不重复自己的情况下编写这段代码?
现在有一个巨大的大脑放屁 我正在编写一个小的股票价格跟踪器,而不是发出多个API请求,我用时间戳将数据保存到本地存储中。 如果我搜索相同的股票,它会查找该商品的本地存储空间 如果库存在本地存储中不存在,它会向API发出获取请求 如果库存确实存在,它将检查当前时间以及保存库存时的时间戳 如果股票时间戳超过限制,它将发出获取请求 如果股票时间戳没有超过限制,它将从localStorage获取数据 这是我目前掌握的代码:Javascript 如何在不重复自己的情况下编写这段代码?,javascript,Javascript,现在有一个巨大的大脑放屁 我正在编写一个小的股票价格跟踪器,而不是发出多个API请求,我用时间戳将数据保存到本地存储中。 如果我搜索相同的股票,它会查找该商品的本地存储空间 如果库存在本地存储中不存在,它会向API发出获取请求 如果库存确实存在,它将检查当前时间以及保存库存时的时间戳 如果股票时间戳超过限制,它将发出获取请求 如果股票时间戳没有超过限制,它将从localStorage获取数据 这是我目前掌握的代码: let info = await retrieve_ticker_info( '
let info = await retrieve_ticker_info( 'aapl' )
let retrieve_ticker_info = async ( ticker ) => {
return new Promise( resolve => {
let data = JSON.parse( localStorage.getItem( `${ticker}` ) )
if ( data ) {
// IF SAVED DATA IS NOT NULL
if ( data.expiration < Date.now() ) {
// IF SAVED DATA IS EXPIRED
fetch( api_url )
.then( res => res.json() )
.then( res => {
data = { ...res, expiration: Date.now() + TIME_TIL_REFRESH }
localStorage.setItem( `${ticker}`, JSON.stringify( data ) )
resolve( data )
})
} else {
// IF SAVED DATA IS NOT EXPIRED
resolve( data )
}
} else {
// IS DATA IS NULL
fetch( api_url )
.then( res => res.json() )
.then( res => {
data = { ...res, expiration: Date.now() + TIME_TIL_REFRESH }
localStorage.setItem( `${ticker}`, JSON.stringify( data ) )
resolve( data )
})
}
})
}
let info=wait retrieve\u ticker\u info('aapl')
让我们检索\u ticker\u info=async(ticker)=>{
返回新承诺(解决=>{
让data=JSON.parse(localStorage.getItem(`${ticker}`)
如果(数据){
//如果保存的数据不为空
如果(data.expirationres.json())
。然后(res=>{
data={…res,过期日期:Date.now()+TIME\u TIL\u REFRESH}
setItem(`${ticker}`,JSON.stringify(数据))
解析(数据)
})
}否则{
//如果保存的数据未过期
解析(数据)
}
}否则{
//数据是否为空
获取(api_url)
.then(res=>res.json())
。然后(res=>{
data={…res,过期日期:Date.now()+TIME\u TIL\u REFRESH}
setItem(`${ticker}`,JSON.stringify(数据))
解析(数据)
})
}
})
}
有了这个,我将不得不重写提取,这似乎不是一个好主意。您可以尝试类似的方法
(async () => {
let info = await retrieve_ticker_info('aapl');
let fetch_data = async (api_url, ticker) => {
const res = await fetch(api_url);
const data = {
...res.json(),
expiration: Date.now() + TIME_TIL_REFRESH
};
localStorage.setItem(`${ticker}`, JSON.stringify(data));
return data;
};
let retrieve_ticker_info = async (ticker) => {
let data = JSON.parse(localStorage.getItem(`${ticker}`));
if (data) {
// IF SAVED DATA IS NOT NULL
if (data.expiration < Date.now()) {
data = await fetch_data(api_url, ticker);
}
} else {
// IS DATA IS NULL
data = await fetch_data(api_url, ticker);
}
return data;
};
})();
(异步()=>{
let info=wait retrieve_ticker_info('aapl');
让fetch\u data=async(api\u url,ticker)=>{
const res=等待获取(api_url);
常数数据={
…res.json(),
过期日期:Date.now()+刷新前的时间
};
setItem(`${ticker}`,JSON.stringify(data));
返回数据;
};
让我们检索\u ticker\u info=async(ticker)=>{
让data=JSON.parse(localStorage.getItem(`${ticker}`));
如果(数据){
//如果保存的数据不为空
如果(data.expiration
编辑:更新代码,将其封装在
async
iLife中。使用ticker
和api\u url
作为参数创建fetchData
函数?是的,这是一个解决方案,但我编写此函数的目的是获取所有信息。当我提交表单时,它运行一个名为:search\u ticker(ticker)
的函数,该函数调用retrieve\u ticker\u info(ticker)
。有点不想再写一封信了。但如果这是唯一的解决方案,那么我想我必须这样做。通常我们在不想重复自己的时候编写函数。所以我不明白你为什么犹豫不决。还有其他问题吗?对于切线,我很抱歉,但我忍不住注意到您没有使用wait
进行fetch
调用。@JacobHeater不知道您需要等待fetch调用。编辑:很快就对它进行了测试,我得到了这个错误:await仅在异步函数中有效
。我认为没有必要。await
不能在async
函数之外使用。可能值得一提的是,let info=wait retrieve\u ticker\u info('aapl')
应该在异步
函数中。我并不反对。我只是复制了原始代码。为了清晰起见,我将进行更新。@MaazSyedAdeeb已用异步IILife更新。