-module(ws_handler).
-export([init/2]).
-export([websocket_init/1]).
-export([websocket_handle/2]).
-export([websocket_info/2]).
init(Req, _Opts) ->
{cowboy_websocket, Req, []}.
websocket_handle({text, Msg}, State) ->
Reply1 = do_something(Msg),
self() ! {reply, Reply1},
Reply2 = do_something(Reply1),
self() ! {reply, Reply2},
Reply3 = do_something(Reply2),
self() ! {reply, Reply3},
{ok, Req, State}.
websocket_info({reply, Msg}, State) ->
{reply, {text, Msg}, State}.
--
Ви отримали це повідомлення, оскільки ви підписані на групу "Erlang в Україні" у Групах Google.
Щоб скасувати підписку на цю групу та більше не отримувати повідомлень із неї, надішліть електронний лист на адресу erlang-in-ukraine+unsubscribe@googlegroups.com.
Щоб опублікувати допис у цій групі, надішліть електронний лист на адресу erlang-in-ukraine@googlegroups.com.
Перейдіть до цієї групи за посиланням https://groups.google.com/group/erlang-in-ukraine.
Щоб скасувати підписку на цю групу та більше не отримувати повідомлень із неї, надішліть електронний лист на адресу erlang-in-ukra...@googlegroups.com.
Щоб опублікувати допис у цій групі, надішліть електронний лист на адресу erlang-i...@googlegroups.com.
%% Есть еще такой вариант чтобы без отдельного генсервера
-module(ws_handler).
-export([init/2]).
-export([websocket_init/1]).
-export([websocket_handle/2]).
-export([websocket_info/2]).
init(Req, _Opts) ->
{cowboy_websocket, Req, []}.
websocket_handle({text, Msg}, State) ->
self() ! {do_one, Msg},
self() ! {do_one, Msg},
self() ! {do_one, Msg},
{ok, Req, State}.
websocket_info({do_one, Msg}, State) ->
Reply = do_something(Msg),
{reply, {text, Reply}, State};
websocket_info({do_two, Msg}, State) ->
Reply = do_something(Msg),
{reply, {text, Reply}, State};
websocket_info({do_three, Msg}, State) ->
Reply = do_something(Msg),
{reply, {text, Reply}, State};
websocket_info({reply, Msg}, State) ->
{reply, {text, Msg}, State}.
--
Ви отримали це повідомлення, оскільки ви підписані на тему в групі "Erlang в Україні" у Групах Google.
Щоб скасувати підписку на цю тему, перейдіть за посиланням https://groups.google.com/d/topic/erlang-in-ukraine/jdJP7HHSbwk/unsubscribe.
Щоб скасувати підписку на цю групу та всі її теми, надішліть електронний лист на адресу erlang-in-ukraine+unsubscribe@googlegroups.com.
Щоб опублікувати допис у цій групі, надішліть електронний лист на адресу erlang-in-ukraine@googlegroups.com.
--
Ви отримали це повідомлення, оскільки ви підписані на групу "Erlang в Україні" у Групах Google.
Щоб скасувати підписку на цю групу та більше не отримувати повідомлень із неї, надішліть електронний лист на адресу erlang-in-ukraine+unsubscribe@googlegroups.com.
-module(ws_handler). -export([init/2]). -export([websocket_init/1]). -export([websocket_handle/2]). -export([websocket_info/2
]). -record(state, { worker }). init(Req, Opts) -> {cowboy_websocket, Req, Opts}. websocket_init(State) -> {ok, State}.
websocket_handle({text, Msg}, State) ->
{ok, Pid, Ref} = do_something(Msg), {ok, State#state{worker = {Pid, Ref}}}. websocket_info(timeout, State) -> TimeoutReply = get_error_reply(timeout), {reply, {text, TimeoutReply}, State}; websocket_info({worker_reply, WorkerPid, WorkerMsg}, #state{worker = {WorkerPid, Ref}} = State) -> demonitor(Ref,[flush]), {reply, {text, WorkerMsg}, State}; websocket_info({'DOWN', _, process, WorkerPid, Reason}, #state{worker = {WorkerPid, _}} = State) -> ErrorReply = get_error_reply(Reason), {reply, {text, ErrorReply}, State}; websocket_info(_Info, State) -> {ok, State}. do_something(Msg) -> Pid = get_worker_process(), Ref = erlang:monitor(process, Pid), gen_server:cast(Pid, {do, Msg}), %% or %% Pid ! {do, Msg}, {ok, Pid, Ref}.
Дякую за відповідьАле спарва в тому що це була спроба зробити з синхронного запиту асинхроннийdo_something може оброблятися кілка хвилин, а в деяких випадках і година я хотів одразу віддати серверу щось на зразок "Чекайте.. Ваш запит обробляється" або помилку в залежності від того що отримав в Reply1
11 марта 2017 г., 16:03 пользователь Volodymyr Stolyarchuk <volodymyr.stolyarchuk@gmail.com> написал:
--Yours sincerely
Taras