tme_317
I’ve been struggling with this for a few hours now and there must be an easy answer despite my inability to search and find answers.
So I have this pretty simple code:
def tcp_port_open?(host, port) do
case :gen_tcp.connect(String.to_charlist(host), port, []) do
{:ok, socket} ->
:gen_tcp.close(socket)
true
{:error, _} ->
false
end
end
def wait_for_true(fun), do: wait_for_true(fun, 10_000)
def wait_for_true(_fun, 0), do: false
def wait_for_true(fun, timeout) do
case fun.() do
true ->
true
false ->
:timer.sleep(100)
wait_for_true(fun, max(0, timeout - 100))
end
end
I’m not sure how to call wait_for_true passing the captured named function tcp_port_open? that needs args.
I’ve tried a few things but they all require Mod.fun/arity or local_fun/arity. Not sure how to pass arguments into the function like so:
wait_for_true(&tcp_port_open?("localhost", 4001))
Thanks!
Trending in Questions
Hi all,
I’m working on a Phoenix project where I need to make external HTTP requests and I’m trying to choose between Req and HTTPoison....
New
I’m very new to Elixir, so sorry if this is a silly question:
I am wondering what happens to the mailbox of a process when the machine i...
New
How do I tell Hologram not to escape HTML when substituting into templates?
{Textile.render(@product.long_description)}
escapes the HTM...
New
Background
When trying to execute mix release on a Windows 11 machine for a Phoenix project I get the following error:
* assembling mark...
New
I’d like to create a file with 600 permissions (rw-------), but there’s a race condition if I create it and then change the permissions. ...
New
Is there a way to import record definitions in the iex shell for pretty printing (similar to the rr command in the erl shell)? This woul...
New
When I use Mix.install with a git dependency, using git@github.com:... how do I change the SSH identity used?
I’ve got two Github accoun...
New
Other Trending Topics
Hey there,
I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first.
...
New
Hi everyone :waving_hand:
I wanted to share something I’ve been building — NowBlind, a random chat app designed to help people discover ...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly)
AI dream has many faces, but general...
New
Localize is the next generation localisation library for Elixir. Think of it as ex_cldr version 3.0. The first version will be released ...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #code-sync
- #discussion
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #elixirconf-us
- #full-time-contract
- #podcasts-by-brainlid
- #blog-post
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #elixirconf-eu
- #processes
- #security
- #api
- #forms
- #performance











Showing Posts 1 to 7- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
kokolegorille
I would pass function and arguments to wait_for_true. In fact, I would pass a mfa form… if there is a named module.
eg.
Then call it like this
BTW I am not sure I would choose such solution for retry… Probably a process, and/or gen_retry.
peerreynders
You need to create a separate closure.
tme_317
Hi @kokolegorille,
Thanks for the suggestion.. I will give it a try when back at my laptop but looks like it should work great.
I didn’t want to spawn another process or use
gen_retrysince I wanted my test process/thread to block until the TCP port is open (or 10 seconds has elapsed… when the timeout will cause an exception). Basically this is to avoid a race condition while testing a nodejs endpoint which needs to be up before I can start running the tests. I think this is a good way to wait but please let me know if I am off-base.Thanks!
kokolegorille
But there is already a clojure with &
You could have written
And so the code would have worked with a named module
If called like this
blatyo
If they were to just do
& Blah.tcp_port_open?("localhost", 4001)it would fail.Here’s an example with the error that explains why:
Basically, a captured function always needs to be able to receive one argument. It can be fixed by wrapping the call in a
fn:kokolegorille
Oh Yes, That really requires one argument at least, thanks for spotting, again
Sorry @peerreynders, You were right
tme_317
Thanks, this works. I knew it would be a simple fix. I had been messing with trying to capture the named function with
&for hours and didn’t even think to simply wrap it in afn -> end.Not sure why captured/anonymous functions still trip me up sometimes!