问题描述
我正在尝试使用 GenServer 实现一个计数器。这个想法是每当客户端访问服务器时增加一个计数器,并在控制台中打印它。但是,每次访问后GenServer 状态重置或PID 终止。有没有办法保持 GenServer 状态持久化?
代码如下:
lib/myapp_web/livecount.ex 中的计数器文件
const props = {
classes: 'this is a value',theme: 'foo',hidden: false,otherProp1: 'other 1',otherProp2: {
nestedProp: 'nested value',},};
const { classes,theme,hidden,...other } = props;
console.log(classes);
console.log(theme);
console.log(hidden);
console.log(other);
我在 lib/myapp_web/endpoint.ex
中添加了以下代码defmodule Counter do
use GenServer
# Client
def start_link(integer \\ 0,opts \\ []) when is_integer(integer) do
GenServer.start_link(__MODULE__,integer,opts)
end
def add(pid) do
GenServer.call(pid,:add)
end
# Server
@impl true
def handle_call(:add,_from,state) do
value = state + 1
{:reply,"Dashboard hit: #{value}",value}
end
@impl true
def init(value) do
{:ok,value}
end
end
这是控制台中的消息:
def message(conn,_opts) do
Code.require_file("lib/myapp_web/livecount.ex")
{:ok,pid} = Counter.start_link()
message = Counter.add(pid)
IO.puts """
Message: #{inspect(message)}
"""
conn
end
我要打印
[info] Sent 200 in 30ms
Message: "Dashboard hit: 1"
[info] CONNECTED TO Phoenix.LiveView.Socket in 143µs
Transport: :websocket
Serializer: Phoenix.Socket.V2.JSONSerializer
Parameters: %{"_csrf_token" => "YyUeC3lgIQ83AlU3VBdoSg9PAwgYGl4QVQW_1PMHOjfg1s72wvoYHW2T","_mounts" => "0","vsn" => "2.0.0"}
[info] CONNECTED TO Phoenix.LiveView.Socket in 105µs
Transport: :websocket
Serializer: Phoenix.Socket.V2.JSONSerializer
Parameters: %{"_csrf_token" => "TToLLhxmCAVIXXsJLVIJOjNYC2QIJy0bxNBzTVdB05HYH6VBKag5XjA_","vsn" => "2.0.0"}
每当客户访问或重新加载页面时,并增加每次所有用户访问的计数器。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)