Erlang: получить оператор с несколькими предложениями времени ожидания - PullRequest
2 голосов
/ 30 августа 2009

Возможно ли для оператора получения иметь несколько предложений времени ожидания, и если да, то каков правильный синтаксис?

Я хочу сделать что-то вроде

foo(Timout1, Timeout2) ->
    receive
    after
        Timeout1 ->
            doSomething1();
        Timeout2 ->
            doSomething2()
    end.

где, в зависимости от того, какой из Timeout1 или Timeout2 меньше, вызывается doSomething1() или doSomething2. Однако приведенный выше код вызывает синтаксическую ошибку.

Если, как я начинаю подозревать, это невозможно, каков наилучший способ достичь того же результата подходящим способом Эрлангии?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 30 августа 2009

Нет, вы не можете. Просто решите, что делать, прежде чем получить.

foo(Timeout1, Timeout2) ->
    {Timeout, ToDo} = if Timeout1 < Timeout2 -> {Timout1, fun doSomething1/0};
                         true -> {Timeout2, fun doSomething2/0} end,
    receive
    after Timeout -> ToDo()
    end.

или

foo(Timeout1, Timeout2) when Timeout1 < Timeout2 ->
    receive
    after Timeout1 -> doSomething1()
    end;
foo(_, Timeout2) ->
    receive
    after Timeout2 -> doSomething2()
    end.

и т.д.

0 голосов
/ 10 сентября 2009

Возможно, вам следует использовать комбинацию 'gen_fsm' и 'timer: send_after'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...