
Sergey
13.05.2018
20:12:49
а почему странный?

Артем
13.05.2018
20:13:29
Странно такое в плаге делать

Sergey
13.05.2018
20:15:20
хм... казалось, что plug — это функция, которая вызывается при обработке http-запроса.
Что странного в том, что я в ней делаю запрос, после того, как ответил на обрабатываемся http запрос?

Артем
13.05.2018
20:20:42
Похоже, твой запрос httpoison ничего не возвращаеь пользователю. Проще всего думать о плаге как о контроллере в mvc в рамках твоей задачи. Пихать лишнее в контроллеры не клево, значит, запрлс нужно унести из плага вовсе.

Google

Артем
13.05.2018
20:22:39
Ну а о send_resp можно дцмать как о render

Sergey
13.05.2018
20:22:55
У меня нет modal и view в рамках моей задачи, у меня внутренний сервис с 2мя точками входа, где плаг просто как обработчик запроса.
Спасибо за ответ, но мне скорее интересен вопрос, почему после send_resp процесс отмирает.

Dmitry
13.05.2018
20:32:41

Артем
13.05.2018
20:33:32
Так посмотри в код. Наверняка ответ сразу уезжает в ковбой и обработка прекращается

Dmitry
13.05.2018
20:34:03
вот я тоже думаю что там просто не дает вернуться вызову

Никита
13.05.2018
20:34:05
ну я насколько понимаю - сенд респ делает halt(сonn) т.е соединение больше не существует.
после того как послал ответ процесс завершается

Sergey
13.05.2018
20:35:40
Да, вы правы, спасибо. Заведу ген сервер отдельный для пост обработки.

Артем
13.05.2018
20:36:29
Ген сервер для такого оверхэд. Достаточно стартовать таск

Никита
13.05.2018
20:37:12
ну и сделать это до того, как отправил ответ)

Артем
13.05.2018
20:38:03
Ну и не забываем, что генсервер один, а запросов может быть много

Azat
13.05.2018
20:38:55
Посоны, бывало ли у вас такое что в юнит-тестах ген-сервер обслуживающий редис иногда падает от очистки его баз данных?

Zwei
13.05.2018
20:42:37

Google

Zwei
13.05.2018
20:42:53
Ты же ещё не ответил на запрос пока твоя функция не отработала до конца

Sergey
13.05.2018
20:43:20

Никита
13.05.2018
20:44:19
Да ну разобрались же вроде. Процесс с соединением живет ради того, чтобы отправить клиенту ответ. После того как он отправил ответ - процесс умирает. Следовательно все что будет в коде после ответа - просто не выполнится.
А юзать таск - тоже тема двоякая. Если сделать Task.acync - потом отправить ответ. То негде будет делать Task.await.

Zwei
13.05.2018
20:45:18
Ну send_resp же не выплёвывает ответ сразу же в момент вызова, он просто модифицирует твой %Plug.Conn{}, который ты потом из этого колбэка возвращаешь

Артем
13.05.2018
20:45:20

Никита
13.05.2018
20:45:24
проще просто spawn новый процесс запустить
хм. а я думал выплевывает) и вот товарищ с проблемой доказал - что выплевывает))

Sergey
13.05.2018
20:47:06
Окей, спасибо, господа!

Никита
13.05.2018
20:47:54
судя потому, что ты после сенд_респ пытаешься что-то сделать - тебе результат клиенту отправлять не нужно. Так что просто перед сенд_респ через spawn в отдельном процессе запусти нужную тебе функцию и все

Артем
13.05.2018
20:48:49

Zwei
13.05.2018
20:54:46
send_resp принимает conn и возвращает conn, который потом ты опять же из call возвращаешь
прерывать выполнение в момент вызова уже какой-то процедурный стаф

Alex
13.05.2018
21:36:16
spawn, как тут советуют - это полная шляпа, процесс который висит в воздухе и никем не контролируется.
я вообще не уверен, что ты получишь в логи запись о падении процесса, который создан через просто spawn.
имхо, самое простое из приемлемых решений в таком случае - это Task.Supervisor. дальше идут более сложные варианты, когда к простому супервизору добавляется процесс-менеджер.

Egor
14.05.2018
03:44:49

Google

Артем
14.05.2018
04:04:55
И в монитор ошибок тоже
И для пинанмя внешней системы когда тебе не нужен ответ этого достаточно

Максим
14.05.2018
09:17:32
Всем привет. Подскажите как победить диалайзер.
Есть вызов HTTPoison.get(url, "X-Redmine-API-Key": "#{Parent.getKey()}"). На что диалайзер ыводит ошибку:
The call 'Elixir.HTTPoison':get(Vurl@1::<<_:8,_:_*1>>,[{'X-Redmine-API-Key',bitstring()},...]) will never return since it differs in the 2nd argument from the success typing arguments: (binary(),[{binary(),binary()}] | #{binary()=>binary()})
Хотя вызов взят с доки на гитхабе

Артем
14.05.2018
09:24:48
[{binary(),binary()}]
наверно указать аргумент так?
не помогает?

Максим
14.05.2018
09:26:31
помогает
хотя в доке

Alexey
14.05.2018
11:51:29

Evgeny
14.05.2018
11:52:31

Alexey
14.05.2018
11:52:39
я восхищен

Evgeny
14.05.2018
11:52:56
Белая зависть, значит.

Alexey
14.05.2018
11:55:22

Evgeny
14.05.2018
11:56:32
странные у вас мечты, товарищ.

Alexey
14.05.2018
12:03:17
не ну а чо. тут же все, как я понял, программируют. личной жизни нет ни у кого )

Evgeny
14.05.2018
12:09:01
Ну почему же. У меня есть кот, компьютер и жена.
А еще два сына, дочь и собака.

Google

Taras ?
14.05.2018
12:09:43
интересная последовательность))

Evgeny
14.05.2018
12:09:58
Но ты прав, никакой личной жизни. Даже в XCOM 2 некогда поиграть.

Taras ?
14.05.2018
12:10:09
кот, компютер и жена ? по убыванию важности чтоль?))
кот в самом начале и собака под конец ? )))

Evgeny
14.05.2018
12:26:23
собака под конец, потому что пытается обидеть моего любимого кота.

Никита
14.05.2018
12:50:31
у мну 9 котов и 4 собаки)

Максим
14.05.2018
13:38:39
а подскажите, в эликсире можно сваять конструкцию типа:
b = "trim"
a= "String.#{b}"
a("ddd")
т.е динамически собрать имя функции? String."trim"("aa") работает. А как это через переменную соорудить?

Nick
14.05.2018
13:39:34
через apply можно

Alik
14.05.2018
13:40:20
https://hexdocs.pm/elixir/Kernel.html#apply/3

Marsel
14.05.2018
13:40:24
iex(1)> a = fn(b) -> "String.#{b}" end
#Function<6.99386804/1 in :erl_eval.expr/5>
iex(2)> a.("ddd")
"String.ddd"
iex(3)>
такое?

Alik
14.05.2018
13:40:26
но не с анонимной функцией

Marsel
14.05.2018
13:40:47
а, не

Alik
14.05.2018
13:41:04
apply String, "ddd", []

Marsel
14.05.2018
13:41:06
поспешил)

Alik
14.05.2018
13:41:37

Egor
14.05.2018
13:42:15
Скорее всего нет, потому что эликсир умеет сам из строк атомы делать

Никита
14.05.2018
13:42:35
мож просто сделать не функции с разными именами, а одну функцию с матчингом на первый параметр, например

Максим
14.05.2018
13:46:48

Evgeny
14.05.2018
14:06:44
b = "trim"
a = fn x -> apply(String, :"#{b}", [x]) end
a.("text ")
Для гурманов-извращенцев
b = "trim"
defmodule Foo do
defmacro a(x) do
String.unquote(:"#{b}")(x)
end
end
require Foo
Foo.a("text ")

Google

Dmitry
14.05.2018
14:29:40
Первый вариант лучше, но сама идея трансформировать user input строки в атомы не самая хорошая идея.

Alex
14.05.2018
14:36:06
мне почему-то кажется, что :"#{x}" это compile time преобразование

Evgeny
14.05.2018
14:39:29
мне кажется, что тебе кажется :)

Alex
14.05.2018
14:39:53
да, мне и вправду кажется

Evgeny
14.05.2018
14:41:31
но в данном случае очевидно, что значение b будет закложурено в лямбду a
но иначе никак
РКП заблочил glot.io вот жеж пидорки

Dmitriy
14.05.2018
14:44:31
Привет. А как сделать broadcast из одного канала в другой? Например, у меня есть канал Messages. Есть обработчик входящего события handle_in "new_msg". Мне нужно внутри этого обработчика отправить исходящее сообщение в другой канал Notifications.
phoenix, "~> 1.3.0"

Alex
14.05.2018
14:48:27

Evgeny
14.05.2018
14:49:13
это однозначно рантайм