如何将 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