Асинхронная функция F #, содержащая цикл while с асинхронными вызовами, не компилируется - PullRequest
1 голос
/ 29 мая 2019

Не совсем уверен, почему мой код не компилируется, у меня ошибка: Incomplete structured construct at or before this point in expression

let resendErrorsAsync (bus: IBus) (errorQueueName: string) =
async {
    let! errorQueue = bus.Advanced.QueueDeclareAsync(errorQueueName) |> Async.AwaitTask
    let! message = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
    while message <> null do
        let utf8Body = Encoding.UTF8.GetString(message.Body)
        let error = JsonConvert.DeserializeObject<Error>(utf8Body)
        let errorBodyBytes = Encoding.UTF8.GetBytes(error.Message)
        let! exchange = bus.Advanced.ExchangeDeclareAsync(error.Exchange, "topic") |> Async.AwaitTask
        let! message = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
}

Кажется, это связано с моими двумя асинхронными вызовами в цикле while, не совсем понятно, почемухотя.

1 Ответ

4 голосов
/ 29 мая 2019

Вы не можете завершить блок с let!, после него должно быть тело;в этом причина синтаксической ошибки.

message, который вы определяете в последней строке, - это переменная, отличная от той, которая была проверена в условии while.Кажется, вы хотите изменить сообщение;для этого вам нужно явно создать изменяемую переменную:

let resendErrorsAsync (bus: IBus) (errorQueueName: string) =
    async {
        let! errorQueue = bus.Advanced.QueueDeclareAsync(errorQueueName) |> Async.AwaitTask
        let! msg = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
        let mutable message = msg
        while message <> null do
            let utf8Body = Encoding.UTF8.GetString(message.Body)
            let error = JsonConvert.DeserializeObject<Error>(utf8Body)
            let errorBodyBytes = Encoding.UTF8.GetBytes(error.Message)
            let! exchange = bus.Advanced.ExchangeDeclareAsync(error.Exchange, "topic") |> Async.AwaitTask
            let! msg = bus.Advanced.GetMessageAsync(errorQueue) |> Async.AwaitTask
            message <- msg
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...