gpt4 book ai didi

rust - 如何将 and_then 链分成两部分?

转载 作者:行者123 更新时间:2023-11-29 08:29:18 24 4
gpt4 key购买 nike

我正在尝试拆分 this future/and-then chain一分为二,所以一部分可以隐藏在一个 crate 中,另一部分暴露在一个 API 中。

原始的工作代码:

let future = wasm_bindgen_futures::JsFuture::from(request_promise)
.and_then(|resp_value| {
// `resp_value` is a `Response` object.
assert!(resp_value.is_instance_of::<Response>());
let resp: web_sys::Response = resp_value.dyn_into().unwrap();
resp.json()
})
.and_then(|json_value: Promise| {
// Convert this other `Promise` into a rust `Future`.
wasm_bindgen_futures::JsFuture::from(json_value)
})
.and_then(|json| {
// Use serde to parse the JSON into a struct.
let branch_info: Branch = json.into_serde().unwrap();

// Send the `Branch` struct back to JS as an `Object`.
future::ok(JsValue::from_serde(&branch_info).unwrap())
});

// Convert this Rust `Future` back into a JS `Promise`.
future_to_promise(future)

尝试拆分,第 1 部分:

pub fn fetch(...) -> impl Future<Item = JsValue>
// ...
wasm_bindgen_futures::JsFuture::from(request_promise)
.and_then(|resp_value| {
// `resp_value` is a `Response` object.
assert!(resp_value.is_instance_of::<web_sys::Response>());
let resp: web_sys::Response = resp_value.dyn_into().unwrap();
resp.json()
})
.and_then(|json_value: js_sys::Promise| {
// Convert this other `Promise` into a rust `Future`.
wasm_bindgen_futures::JsFuture::from(json_value)
})

第 2 部分:

let r = fetch(...);

r.and_then(|json| {
let branch_info: Branch = json.into_serde().unwrap();
future::ok(JsValue::from_serde(&branch_info).unwrap())
});

这会编译,但会导致警告 warning: unused `futures::future::and_then::AndThen` that must be used,以及运行时 panic (在浏览器中),这大概是有关的。根据我链接的原始示例,这可以通过末尾的 wasm_bindgen_futures::future_to_promise(r) 行来缓解,但是在拆分后使用时,副完整功能,我们收到此错误:expected associated type, found struct `wasm_bindgen::JsValue`。 可能有一种特定于 future 的方法来解决这个问题,它不涉及转换回 JsValue 并在最后处理 promise 。我怀疑这可以通过一个简短的修改来解决(比如最后的 unwrap() ),但我无法从 future API 文档中确定是什么。

最佳答案

在第 2 部分中,您将在以下内容中使用 and_then 链接您的 future :

r.and_then(|json| {
let branch_info: Branch = json.into_serde().unwrap();
future::ok(JsValue::from_serde(&branch_info).unwrap())
});

问题是你没有将它分配给任何东西,所以你丢失了结果,你需要将它分配给一个变量,然后像下面这样使用它:

let r_fin = r.and_then(|json| {
let branch_info: Branch = json.into_serde().unwrap();
future::ok(JsValue::from_serde(&branch_info).unwrap())
});

赋值给r_fin后,可以传递给future_to_promise:

future_to_promise(r_fin)

通过这种方式,您将使用链式 future r_fin

关于rust - 如何将 and_then 链分成两部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53927781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com