Erlang:接收带有多个超时子句的语句

时间:2009-08-29 21:21:24

标签: erlang

receive语句是否可能有多个超时子句,如果有,那么正确的语法是什么?

我想做点什么

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

其中,取决于Timeout1Timeout2中的哪个较小,调用doSomething1()doSomething2。但是,上面的代码会导致语法错误。

如果我开始怀疑这是不可能的,那么以合适的Erlangy方式获得相同结果的最佳方法是什么?

提前致谢!

2 个答案:

答案 0 :(得分:4)

不,你不能。只需在收到之前决定做什么。

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.

答案 1 :(得分:0)

您应该使用'gen_fsm'和'timer:send_after'的组合。