如何将 and_then 链分成两部分?
How do I split an and_then chain into two parts?
我正试图将 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() 之类的东西),但我无法从期货 API 文档中确定是什么。
在第 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
。
我正试图将 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() 之类的东西),但我无法从期货 API 文档中确定是什么。
在第 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
。