Rust
的Future
与Javascript
的Promise
功能对照参考
学习新鲜技术时,我总是会习惯性向曾经熟悉的内容上靠,甚至套用现有的认知模型。这次也不例外,对照Javascript - Promise/A+ API
来记忆一部分Rust Future
常用API
。
注意:所有的
Rust - Future
操作都是以.await
结尾的。这是因为,不同于Javascript - Promise/A+
,Rust - Future
是惰性的。只有被.await
指令激活后,在Rust - Future
内封装的操作才会被真正地执行。
javascript | rust | 描述 |
---|---|---|
Promise.resolve(...) | use ::async_std::future;future::ready(Ok(...)) | 在 rust 中,Future 自身不区分异步成功,还是异步失败。需要给异步计算结果套上 Result<T, E> 马甲,来做 resolve 与 reject 的差别处理。 |
Promise.reject(...) | use ::async_std::future;future::ready(Err(...)) | 在 rust 中,Future 自身不区分异步成功,还是异步失败。需要给异步计算结果套上 Result<T, E> 马甲,来做 resolve 与 reject 的差别处理。 |
Promise.catch(err => err) | use ::async_std::future;future::ready(...) | 在 rust 中,Future 自身不区分异步成功,还是异步失败。需要给异步计算结果套上 Result<T, E> 马甲,来做 resolve 与 reject 的差别处理。 |
new Promise(() => {/* 什么都不做 */}) | use ::async_std::future;future::pending() | |
new Promise((resolve, reject) => setTimeout(() => { if (Math.random() > .5) { resolve(1); } else { reject(new Error('1')); }}, 500)) | use ::async_std::task;use ::std::{thread, time::Duration};use ::rand::prelude::*;task::spawn_blocking(|| { thread::sleep(Duration::from_millis(500)); let mut rng = rand::thread_rng(); if rng.gen() > 0.5f64 { Ok(1) } else { Err('1') }}).await; | 1. future::poll_fn<F, T>(f: F) -> T where F: FnMut(&mut Context<'_>) -> Poll 不能被用来构造包含了异步操作的 Future 实例,因为【回调闭包】内的【可修改引用】&mut Context<'_> 不能被 (1)跨线程传递 (2)传递出闭包作用域2. task::spawn_blocking() 【回调闭包】输入参数内的 thread::sleep() 不是阻塞运行 task::spawn_blocking() 的主线程,而是阻塞从【阻塞任务线程池】中分配来运行阻塞任务的【工作线程】。 |
Promise.all([promise1, promise2, promise3]) | future1.try_join(future2).try_join(future3).await | 1. 有一个 promise/future 失败就整体性地失败。2. try_join 成员方法要求其 Self 为 Future<Output = Result<T, E>>3. 返回结果:Result<(T1, T2, T3), E> |
Promise.all([ promise1.catch(err => err), promise2.catch(err => err) promise3.catch(err => err)]) | future1.join(future2).join(future3).await | 1. promise/future 的成功与失败结果都收集2. 返回结果:(T1, T2, T3) |
Promise.race([promise1, promise2, promise3]) | future1.try_race(future2).try_race(future3).await | 1. 仅只收集第一个成功的 promise/future2. try_race 成员方法要求其 Self 为 Future<Output = Result<T, E>>3. 返回结果:Result<T, E> |
Promise.race([ promise1.catch(err => err), promise2.catch(err => err) promise3.catch(err => err)]) | future1.race(future2).race(future3).await | 1. 收集第一个结束的 promise/future,无论它是成功结束还是失败收场。2. 返回结果:T |
1
共 0 条评论, 1 页
评论区
写评论还没有评论