Elixir 在模块中存储变量

Elixir 在模块中存储变量,elixir,phoenix-framework,Elixir,Phoenix Framework,我原以为这是一个非常基本的问题,但在网上搜索后,我找不到解决办法 我想把一个变量存储在某个地方,然后在函数中引用它 我想解决的问题如下: 我执行HTTP请求以获取API的accesstoken。此令牌仅在一段时间内有效,我只想在旧令牌过期时获取新令牌。 我需要此令牌来执行其他请求。 所以我必须将令牌和它的有效时间存储在某个地方,以便在其他函数中访问它,在这里我可以访问其他请求。我最近也经历过类似的事情,它看起来应该很简单的原因是因为我试图使Elixir像一种面向对象的语言一样工作。要做到这一点,

我原以为这是一个非常基本的问题,但在网上搜索后,我找不到解决办法

我想把一个变量存储在某个地方,然后在函数中引用它

我想解决的问题如下:
我执行HTTP请求以获取API的accesstoken。此令牌仅在一段时间内有效,我只想在旧令牌过期时获取新令牌。 我需要此令牌来执行其他请求。

所以我必须将令牌和它的有效时间存储在某个地方,以便在其他函数中访问它,在这里我可以访问其他请求。

我最近也经历过类似的事情,它看起来应该很简单的原因是因为我试图使Elixir像一种面向对象的语言一样工作。要做到这一点,没有现成的简单方法

您需要做的(我认为)是创建一个使用gen_server的模块。在那里,您可以放置代码以获取api密钥,也可以放置代码以在一段时间后刷新它

检查这个伪代码

defmodule APIKey do
  use GenServer

  def init(_) do
    IO.puts "init was called"
    # code to go get the api key
    apikey = "blahblahblah"
    :timer.send_interval(1_400_000, :cleanup)
    {:ok, apikey}
  end

  def handle_call({:get}, _, state) do
    IO.puts "handle_call was called"
    {:reply, state, state}
  end

  def handle_info(:refresh, state) do
    # put some code here to refresh the api key
  end

  def start do
    GenServer.start(APIKey, nil)
  end

  def get(pid) do
    IO.puts "get was called"
    GenServer.call(pid, {:get})
  end
end
通过执行类似于
{:ok,pid}=APIKey.start的操作来调用它。每1400000秒,它将运行清理代码并获得一个新的apikey。通过运行
APIKey.get(pid)

此令牌仅在一段时间内有效,我只想在旧令牌过期时获取新令牌

使用ets模块进行以下操作:


Elixir(以及其他函数式语言)中没有全局/模块变量,因为这些变量会导致竞争条件。

写入临时文件有什么不对?对于这样一个“简单”的任务来说,这不是有点过分吗?你现在明白为什么这不是一个“简单”的问题了吗?我实际上不明白“为什么”不简单。但我明白这并不简单;)这看起来很有希望!第二天我会尝试一下。此外,你可以使用代理:如果ets的使用看起来太复杂:-)ets似乎是我要找的东西。但我想我还是不了解长生不老药的一些基本概念。例如“如何在运行时完成一次任务?”exmaple创建一个初始ets,其中包含一些值。在任何Elixir应用程序中,您都有一个
start/2
功能,您可以为其添加任何初始化逻辑。例如,如果MyApp.TokenStorage模块与ets一起工作,您可以创建并调用MyApp.TokenStorage.init/0函数,与令牌相关。在这里查看更多详细信息:它应该放在哪里?控制器?模型?