Как интегрировать деформацию с асинхронными библиотеками?

У Warp есть такая парадигма,

let hi = warp::path("hello")
    .and(warp::path::param())
    .and(warp::header("user-agent"))
    .map(|param: String, agent: String| {
        format!("Hello {}, whose agent is {}", param, agent)
    });

Эти фильтры предоставляют .map(), который позволяет вам вызывать закрытие с извлеченным значением (вывод из предыдущего фильтра).

Как мне действовать в рамках этой парадигмы, если в приведенном выше примере я хочу сделать что-то вроде этого,

.map(async |param: String, agent: String| {
    foo(&param).await?;
    format!("Hello {}, whose agent is {}", &param, agent)
});

Когда я использую асинхронные функции в закрытии .map фильтра, я получаю эту ошибку,

ошибка [E0708]: async не move замыкания с параметрами в настоящее время не поддерживаются

Есть ли способ сделать warp совместимым с библиотекой, которая уже является асинхронной?


person Evan Carroll    schedule 06.05.2021    source источник


Ответы (1)


Вы можете использовать and_then:

.and_then(|param: String, agent: String| async move {
    foo(&param).await?;
    Ok(format!("Hello {}, whose agent is {}", &param, agent))
});

Обратите внимание, что на самом деле это не async закрытие, это обычное закрытие, которое возвращает будущее, созданное блоком async. См. В чем разница между |_| async move {} и _6 _ для получения дополнительной информации.

person Ibraheem Ahmed    schedule 06.05.2021