为什么我不允许破坏 Promise?

jak*_*kar 7 rakudo promise raku

以下简单的承诺是发誓的,我不允许打破它。

my $my_promise = start {
    loop {}   # or sleep x;
    
    'promise response'
}

say 'status : ', $my_promise.status;      # status : Planned

$my_promise.break('promise broke');       # Access denied to keep/break this Promise; already vowed
                                          # in block <unit> at xxx line xxx
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Eli*_*sen 9

因为誓言誓言,你不能改变它:只有真正拥有誓言的东西,才能打破承诺。这就是vow功能的意图。

你试图通过违背你所展示的承诺来实现什么?是要停止在start块内完成的工作吗?打破承诺不会那样做。并且vow明确添加了该机制以防止您认为它可以以某种方式停止start块内的工作。

如果您希望start块内的工作可中断,则需要添加某种定期检查的信号量,例如:

my int $running = 1;
my $my_promise = start {
    while $running {
        # do stuff
    }
    $running
}

# do other stuff
$running = 0;
await $my_promise;
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的。