0

我正在尝试为 XMLHttpRequest 创建一个可以调用的模块Reason.useEffect。下面的代码我在一个实例中尝试过并且似乎可以工作,但我希望能够Reason.useEffect提供调用库“中止”的能力:现在我正在给它,None所以React如果不做任何事情有问题。

type request;
type response;
[@bs.new] external makeXMLHttpRequest: unit => request = "XMLHttpRequest";
[@bs.send] external addEventListener: (request, string, unit => unit) => unit = "addEventListener";
[@bs.get] external response: request => response = "response";
[@bs.send] external open_: (request, string, string) => unit = "open";
[@bs.send] external setRequestHeader: (request, string) => unit ="setRequestHeader";
[@bs.send] external send: request => unit = "send";
[@bs.send] external abort: request => unit = "abort";

[@bs.scope "JSON"][@bs.val] external parseResponse: response => {. "message": array(string)} = "parse";

let send = (~responseCB, ~errorCB, ~apiURL) => {
    let request = makeXMLHttpRequest()

    request->addEventListener("load", ()  => responseCB( (request->response->parseResponse)##message ) )
    request->addEventListener("error", () => errorCB())
    request->open_("GET", apiURL)

    request->send
    /* How do I return the "request->abort" method as an option? */
    /* Some(request->abort) */
    None
}

我通过以下方式调用上述内容:

let responseCB = (response) => setState(_previousState => LoadedDogs(response));
let errorCB = () => setState(_previousState => ErrorFetchingDogs);

React.useEffect0(
    () => XMLHttpRequest.send(
            ~responseCB,
            ~errorCB,
            ~apiURL="https://dog.ceo/api/breeds/image/random/3"
        )
);

我对 FP陌生,已经 30 多年了。

4

1 回答 1

0

如果我理解正确,因为你没有说如果你尝试做“明显的”你会得到什么错误,问题是React.useEffect0期望一段option(unit => unit)时间Some(request->abort)request->abort立即执行并返回option(unit)

如果是这样,解决方案应该只是创建一个在调用时unit => unit简单调用的函数request->abort

Some(() => request->abort)
于 2020-12-15T11:39:26.083 回答