23 · Concorrência
Lendo uma fonte assíncrona
`for await` pede um valor por vez à fonte e aguarda `next()` antes de executar o corpo do laço.
Nesta página
for await pede um valor por vez à fonte e aguarda next() antes de executar o corpo do laço. Nil encerra a iteração. O método conhecido next() deve retornar Future<T?> ou Task<T?>, e a fonte deve implementar core::cleanup::Cleanup. O exemplo consome uma fonte inteira e interrompe outra antes do fim; ambas são fechadas.
Lendo uma fonte assíncrona.
use core::cleanup::Cleanup
struct Events { remaining: int }
impl Events {
async fn next(self) -> int? {
if self.remaining <= 0 { return nil }
let value = self.remaining
self.remaining -= 1
return value
}
}
impl Cleanup for Events {
fn close(self) { print("closed") }
}
let complete = Events { remaining: 3 }
var sum = 0
for await value in complete { sum += value }
assert_eq(sum, 6)
let early = Events { remaining: 5 }
:events for await value in early {
if value == 4 { break :events }
print(value)
}
print(sum)
A fonte é adquirida uma vez e fechada ao terminar, interromper, retornar, falhar ou receber cancelamento cooperativo. Padrões, inclusive for await case, examinam o valor aguardado. Arrays síncronos não se tornam fontes assíncronas. Execute com a CLI; wasm-aot rejeita operações do escalonador explicitamente.
Veja também