【问题标题】:How to store and fetch data from hash tables - javascript如何从哈希表中存储和获取数据 - javascript
【发布时间】:2014-10-22 19:17:35
【问题描述】:

我在 javascript 上找不到任何东西,但这可能会很快得到澄清。我正在一个网站上工作,我必须通过来自服务器的 http 请求检索数据。因为我需要发出几个请求并且数据是不变的,所以我想做的是用键和值制作表 -> 将这些值存储在文件中 -> 然后能够检索这些值。这样我必须读取一个文件,而不是通过 30 个 http 请求获取数据

总体思路:

Given: spell id = number (Ex. 45)
Output: name of spell = string (Ex. fire...)

Use this output to then fetch the url of the image of the spell (containing the spell name)

编辑

代码:

// When I fetch the file i use (json data)
    function getChampionImage(id) {
                    var champUrl = "https://na.api.pvp.net/api/lol/static-data/na/v1.2/champion/" +id +"/?api_key=....."
                    xmlHttp = new XMLHttpRequest();
                    xmlHttp.open( "GET", champUrl, false );
                    xmlHttp.send( null );
                    var jsonText = xmlHttp.responseText;
                    var champData = JSON.parse(jsonText);
                    var champName = champData.key;
                    return "http://ddragon.leagueoflegends.com/cdn/" + versionNum + "/img/champion/"+champName+".png";


                }

【问题讨论】:

  • 如果您发布文件加载代码,我将向您展示如何集成缓存,非常简单。
  • 我添加了获取 json 的代码,然后获取要在 url 中使用的数据。不知道你说的是不是这个
  • 一个javascript对象是一个哈希表。

标签: javascript file-io hashmap


【解决方案1】:

您需要做的就是将响应附加到一个对象上,通过输入键入。 这在同步 IO 中特别简单,因为您不必担心回调范围。

由于函数是 JS 中的对象,因此您可以将过程本身用作命名空间,它可以很好地与方法配合使用,因为您不需要外部变量:

// When I fetch the file i use (json data)
    function getChampionImage(id) {
                    var cached=getChampionImage["_"+id];
                    if(cached) return cached;
                    var champUrl = "https://na.api.pvp.net/api/lol/static-data/na/v1.2/champion/" +id +"/?api_key=....."
                    xmlHttp = new XMLHttpRequest();
                    xmlHttp.open( "GET", champUrl, false );
                    xmlHttp.send( null );
                    var jsonText = xmlHttp.responseText;
                    var champData = JSON.parse(jsonText);
                    var champName = champData.key;
                    return getChampionImage["_"+id]="http://ddragon.leagueoflegends.com/cdn/" + versionNum + "/img/champion/"+champName+".png";

                }

编辑:要在页面访问之间保留 url 数据,请使用 localStorage 作为哈希对象:

function getChampionImage(id) {
                var cached=localStorage["_"+id];
                if(cached) return cached;
                var champUrl = "https://na.api.pvp.net/api/lol/static-data/na/v1.2/champion/" +id +"/?api_key=....."
                xmlHttp = new XMLHttpRequest();
                xmlHttp.open( "GET", champUrl, false );
                xmlHttp.send( null );
                var jsonText = xmlHttp.responseText;
                var champData = JSON.parse(jsonText);
                var champName = champData.key;
                return localStorage["_"+id]="http://ddragon.leagueoflegends.com/cdn/" + versionNum + "/img/champion/"+champName+".png";


            }

请注意,使用 localStorage,如果您进行更改,则必须使缓存自行过期。

【讨论】:

  • 但是当我重新加载页面时,缓存会保留吗?我觉得好像如果我重新加载页面缓存会被清除干净,对吗?编辑 - 因为如果我在一个客户端上找到一个冠军 - 我希望它位于在他们之后访问网站的客户端的缓存中
  • 我没有注意到关于持久性的部分,但这也很简单,我会在编辑中告诉你
  • 好的。是的,如果我可以让它保留在缓存中。我得走了,但我一小时后回来。你可以编辑回复。谢谢
  • 自我过期是什么意思? - 对不起,这是一个不好的问题 - 这是否意味着暂时编辑缓存另外...这个 localStorage 变量是否已经在 html 中自动生成?
  • 是的,localStorage 随浏览器一起提供,几乎所有浏览器都有。我的观点是,一旦它被缓存在这个系统中,它就永远不会被再次获取,所以如果你想更新数据,你必须手动删除 localStorage 键,或者通过附加随机查询字符串参数来更改 url,所以它被缓存遗漏了。如果给定 URL 后面的数据永远不会改变,则忽略整个警告。
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2017-04-03
  • 2012-01-31
相关资源
最近更新 更多