将变量存储在模块中

时间:2015-11-22 13:44:44

标签: elixir phoenix-framework

我认为这是一个非常基本的问题,但在搜索网后,我找不到解决方案。

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

我想解决的问题如下:
我执行HTTP请求以获取API的accessstoken。此令牌仅在一段时间内有效,我只想在旧令牌过期时获得新令牌。 我需要这个令牌来做其他请求 因此,我必须存储令牌及其在某处有效的时间,以便在其他函数中访问它,其中我可以访问其他函数。

2 个答案:

答案 0 :(得分:2)

我最近也经历了这样的事情,而且它看起来应该很简单的原因是因为我试图让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之类的操作来调用它。每隔1,400,000秒,它将运行清理代码并获得一个新的apikey。您可以通过运行APIKey.get(pid)

在代码中使用密钥

答案 1 :(得分:2)

  

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

使用ets模块执行以下操作:http://elixir-lang.org/getting-started/mix-otp/ets.html

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