< 返回我的博客

爱国的张浩予 发表于 2021-08-12 07:36

Tags:rust,async-std,future,js,promise

RustFutureJavascriptPromise功能对照参考

学习新鲜技术时,我总是会习惯性向曾经熟悉的内容上靠,甚至套用现有的认知模型。这次也不例外,对照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 页