Javascript 如何在不重复自己的情况下编写这段代码?

Javascript 如何在不重复自己的情况下编写这段代码?,javascript,Javascript,现在有一个巨大的大脑放屁 我正在编写一个小的股票价格跟踪器,而不是发出多个API请求,我用时间戳将数据保存到本地存储中。 如果我搜索相同的股票,它会查找该商品的本地存储空间 如果库存在本地存储中不存在,它会向API发出获取请求 如果库存确实存在,它将检查当前时间以及保存库存时的时间戳 如果股票时间戳超过限制,它将发出获取请求 如果股票时间戳没有超过限制,它将从localStorage获取数据 这是我目前掌握的代码: let info = await retrieve_ticker_info( '

现在有一个巨大的大脑放屁

我正在编写一个小的股票价格跟踪器,而不是发出多个API请求,我用时间戳将数据保存到本地存储中。 如果我搜索相同的股票,它会查找该商品的本地存储空间

如果库存在本地存储中不存在,它会向API发出获取请求

如果库存确实存在,它将检查当前时间以及保存库存时的时间戳

如果股票时间戳超过限制,它将发出获取请求

如果股票时间戳没有超过限制,它将从localStorage获取数据

这是我目前掌握的代码:

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更新。