2014-11-15 1 views
0

Я хочу сделать асинхронный запрос на отправку httpc, используя {приемник, приемник} и {sync, false} .Receiver может быть pid(), но я хочу использовать его как функцию с 1 аргументом, который получает идентификатор, из которого я могу извлечь pid(). Я не могу использовать pid() здесь, потому что pid() может измениться, если процесс перезапускается, но id остается таким же. Если кто-нибудь может дать мне пример того, как использовать приемник как функцию. это было бы большой помощью.Erlang asynchronous httpc post request

ответ

0

В Erlang вы можете зарегистрировать процесс под каким-либо именем с помощью register/2. Например, вы можете назвать это, когда вы начинаете процесс обработчика:

register(post_handler, self()). 

Таким образом, вы можете использовать новое имя с ! оператора:

post_handler ! message. 

Таким образом, вы можете использовать функцию в качестве приемника таким образом:

Receiver = fun(ReplyInfo) -> post_handler ! ReplyInfo end. 
request(post, Request, HTTPOptions, [{receiver, Receiver} | OtherOptions], Profile). 
0

Я думаю, что, когда вы звоните httpc: Запрос/4, вы знаете, Id вы хотите использовать, а функция для получения соответствующего PID, поэтому вам просто нужно создать анонимную FUNC Тион непосредственно перед вызовом httpc: запросить/4:

IdRequest = createIdRequest(Request), 
ReceiverFunc = fun(ReplyInfo) -> getPid(IdRequest) ! {http,ReplyInfo} end, 
httpc:request(Method, Request, HTTPOptions,[{sync, false},{receiver,ReceiverFunc}|Opts]). 

Если вы боитесь, что процесс приема умер и был перезапущен (с новым ИДП), обратите внимание, что при этом (или с помощью зарегистрированных процессов) будет по-прежнему позволяют некоторое время окно был ли процесс приема не существует (или еще не зарегистрирован). Функция getPid должна иметь дело с этим, и в любом случае отправленное сообщение может быть потеряно (pid dead) или создать сбой (процесс еще не зарегистрирован).

На мой взгляд, вы ищете возможность восстановления после ошибки на слишком низком уровне, создавая бесполезную сложность.