如何将and_then链分为两部分?

时间:2018-12-26 05:30:01

标签: rust webassembly

我正在尝试将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文档中确定什么。

1 个答案:

答案 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