- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试拆分 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/
我是一名优秀的程序员,十分优秀!