Как я могу прервать обещание в Раку? - PullRequest
9 голосов
/ 06 февраля 2020

Я знаю, что могу запланировать сохранение Promise в течение определенного времени с

my $promise = Promise.in($seconds);

, но как я могу запланировать его нарушение? В частности, я имею в виду обещание, которое будет «истекло», так что у него будет определенное количество времени, которое будет сохранено, иначе оно не будет выполнено.

Я могу сделать это с другим Promise Примерно так:

my $promise = Promise.new;
...
Promise.in($seconds).then: { $promise.break };

Но это кажется немного ... расточительным. Есть ли лучший способ сделать это?

1 Ответ

10 голосов
/ 06 февраля 2020

Обычный пример - написать что-то вроде этого:

await Promise.anyof($the-promise, Promise.in(10));
if $the-promise {
    # it finished ahead of the timeout
}
else {
    # it timed out
}

Это не проявляется в виде ломаной Promise, хотя это не так уж и плохо (поскольку нужно различать guish Отмена против ошибки во многих случаях, так или иначе, так что вам все равно придется выполнить некоторые сопоставления для типа исключения). Этот факторинг также имеет то преимущество, что $the-promise не обязательно должен быть тем, к которому у вас есть доступ, чтобы сохранить / разбить.

Можно также обернуть это примерно так:

class TimedOut is Exception {}
sub timeout($promise, $time) {
    start {
        await Promise.anyof($promise, Promise.in($time));
        $promise ?? await($promise) !! die(TimedOut.new)
    }
}

Который снова будет работать с любым $promise, передавать результат или исключение и в противном случае генерировать исключение по тайм-ауту.

При этом следует помнить, что на самом деле это не так. производить отмену незавершенного производства. Это может не иметь значения, или это может быть важно. Если последнее, вы, вероятно, захотите:

  • A Promise, который вы используете для передачи отмены; вы сохраняете его при отмене и опрашиваете его в коде, который будет выполнять отмену
  • Чтобы посмотреть на использование парадигмы Supply вместо модели отмены (закрытие крана).
...