我正在尝试将this future/and-then chain分成两部分,以便可以将一部分隐藏在板条箱中,而另一部分可以隐藏在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
和运行时恐慌(在浏览器中),这可能是相关的。按照我链接的原始示例,可以通过在末尾使用行wasm_bindgen_futures::future_to_promise(r)
来缓解这种情况,但是当在拆分(完整功能)后使用它时,我们会收到以下错误消息:expected associated type, found struct `wasm_bindgen::JsValue`.
可能存在期货-解决此问题的特定方法,该方法无需转换回JsValue并最终处理承诺。我怀疑可以通过简短的修改(最后是unwrap()之类的东西)来解决,但是我无法从Futures API文档中确定什么。
答案 0 :(得分:1)
在第2部分中,您将通过以下方式与and_then
链接您的未来:
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)
这样,您将使用链接的未来r_fin
。