[英]How can I create interoperability between different Future traits in Rust?
我正在嘗試使用binance_async
庫、 tokio
和futures
向 Binance 發出並發訂單。 (請參閱本問題末尾的注釋。)
我使用的binance_async
函數返回binance_async::error::Result<impl futures::future::Future<_, _>>
類型。 我面臨以下問題,在這兩個示例中進行了說明:
let bn = Binance::with_credential(&api_key, &secret_key);
let fut = bn.limit_sell(&symbol, qty, price);
tokio::spawn(fut.unwrap()); // ERROR
/* Error message:
error[E0277]: `impl futures::future::Future` is not a future
--> src/main.rs:23:5
|
23 | tokio::spawn(fut.unwrap());
| ^^^^^^^^^^^^ `impl futures::future::Future` is not a future
|
= help: the trait `futures::Future` is not implemented for `impl
futures::future::Future`
*/
這太奇怪了。 首先,我在任何地方都找不到futures::Future
——只有fut.unwrap()
實現的futures::future::Future
。 有什么幫助嗎?
let mut orders : Vec<Result<_>> = Vec::new(); // not std::Result
let fut = bn.limit_sell(&symbol, qty, price);
orders.push(fut);
let mut futures = Vec::new(); // I want to unwrap them, to use join_all()
for f in orders.iter() {
match *f {
Ok(x) => {
futures.push(x);
},
Err(e) => {}
}
}
futures::future::join_all(futures).await; // <--- ERROR!
/* Error message (one of 3 similar ones):
error[E0277]: `impl futures::future::Future` is not a future
--> src/main.rs:37:5
|
37 | join_all(futures).await; // <--- ERROR!
| ^^^^^^^^^^^^^^^^^^^^^^^ `impl futures::future::Future` is not a future
|
= help: the trait `futures::Future` is not implemented for `impl
futures::future::Future`
= note: required because of the requirements on the impl of `futures::Future` for
`JoinAll<impl futures::future::Future>`
= note: required by `futures::Future::poll`
*/
同樣的錯誤,同樣的問題。
筆記:
binance_async
是一個維護不足的庫。 我很可能會完全放棄這種方法,而用 go 代替binance
crate。 我只是對這個錯誤很好奇。非常感謝:)
binance_async
使用 futures 0.1,它與tokio
使用的現在標准化的std::future::Future
不兼容。 您可以通過啟用compat
功能將 futures 0.1 未來轉換為標准未來:
futures = { version = "0.3", features = ["compat"] }
並調用.compat()
方法:
use futures::compat::Future01CompatExt;
tokio::spawn(fut.unwrap().compat());
use futures::compat::Future01CompatExt;
orders.push(fut.compat());
futures::future::join_all(futures).await;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.