如何在不重复自己的情况下编写此代码块?

时间:2019-04-20 03:23:49

标签: javascript

现在脑子里放屁...

我正在编写一个小小的股价跟踪器,而不是发出多个API请求,而是使用时间戳将数据保存到我的localStorage中。 如果我搜索相同的库存,则它将在我的localStorage中查找该物料。

如果本地存储中没有股票 ,则会向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 )
                })
        }
    })
}

有了这个,我将不得不重写获取,这似乎不是一个好主意。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情。

(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;
  };

})();

编辑:更新了代码以将其包装在async IIFE中。