我怎样才能“解决"生 rust 的未来?

dwbf0jvd  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(131)

我正在rust中学习并发,找不到一个简单的例子来返回和解析一个Future
我如何在rust中实现这段javascript代码呢?看起来我必须在某个struct上实现Future trait并返回它(对吗?),但是我想要一个简单的例子。除了setTimeout,它可以是任何东西,只要保持简单就行了。

function someAsyncTask() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("result")
    }, 1_000)
  })
}
omhiaaxx

omhiaaxx1#

可以创建的最直接的fn() -> impl Future是使用async函数:

use std::time::Duration;
use tokio::time;

async fn some_async_task() -> &'static str {
    time::sleep(Duration::from_millis(1_000)).await;
    "result"
}

如果您“删除”一层语法糖,则会变成下面的fn,返回一个async块。

use std::time::Duration;
use std::future::Future;

use tokio::time;

fn some_async_task() -> impl Future<Output = &'static str> {
    async {
        time::sleep(Duration::from_millis(1_000)).await;
        "result"
    }
}
gwo2fgha

gwo2fgha2#

在Rust futures中,与JavaScript的Promise构造函数最类似的是 oneshot channel,如futurestokio中所示,通道的“发送方”类似于resolve函数,通道的“接收方”是Future,其工作方式类似于Promise,没有单独的reject操作;如果希望传递错误,可以通过在通道中传递Result来实现。
翻译您的代码:

use futures::channel::oneshot;

fn some_async_task() -> oneshot::Receiver<&'static str> {
    let (sender, receiver) = oneshot::channel();
  
    set_timeout(|| {  // not a real Rust function, but if it were...
      sender.send("result").unwrap()
    }, 1_000);
  
    receiver
}

请注意,就像你只需要在JS中使用new Promise,如果你要把回调之类的东西翻译到承诺世界中,你只需要在Rust中使用new Promise,如果你需要从外部事件完成一个未来,这两种情况都应该是相当罕见的。

相关问题