Ocaml 如何在两个事件处理程序之间共享数据?

Ocaml 如何在两个事件处理程序之间共享数据?,ocaml,reason,bucklescript,Ocaml,Reason,Bucklescript,我正在玩reason和buckelscript,作为练习,我为http.get() 使用这个绑定,我想编写这个简单的代码片段 http.get('http://jsonplaceholder.typicode.com/posts/1', (res) => { let results = []; res.on('data', (chunk) => { results.push(chunk) }); res.on('end', () => { console.l

我正在玩reason和buckelscript,作为练习,我为
http.get
()

使用这个绑定,我想编写这个简单的代码片段

http.get('http://jsonplaceholder.typicode.com/posts/1', (res) => {
  let results = [];
  res.on('data', (chunk) => { results.push(chunk) });
  res.on('end', () => {
    console.log(results.join())
  });
});
我想用它来解释

Http.Client.get("http://jsonplaceholder.typicode.com/posts/1", response => {
  let results = [];
  Http.IncomingMessage.on(
    response,
    `data(
      data => {
        // Append data to results here, but how ? This line does not compile
        results = [data, ...results];
      },
    ),
  );

  Http.IncomingMessage.on(
    response,
    `_end(() => {
      // Print results
      Js.log("END")
    })
  )
});

results
是不可变的,新绑定将无法从
end
回调访问。你知道如何解决这个问题吗?

我用这段代码成功地解决了这个问题

Http.Client.get("http://jsonplaceholder.typicode.com/posts/1", response => {
  let results = [||];
  response
  |. Http.IncomingMessage.on(
       `data(
         data => {
           let results = Array.append(results, [|data|]);
           response
           |. Http.IncomingMessage.on(
                `_end(
                  () =>
                    Js.log(
                      results |> Buffer.concatArray |> Buffer.toString,
                    ),
                ),
              );
         },
       ),
     );
});

它可以工作,但我很确定这不是最有效的方法。

你的函数
上有类型

(t, [ | `_end(unit => unit) | `data(Buffer.t => unit)]) => unit
因此,如果您想在对的
的两次调用之间建立一个通信通道,那么您唯一的选择就是使用一些副作用的计算,例如,a、i/O通道等

如果你想坚持一种更为有效的编程风格,那么你应该考虑将处理程序的返回类型改为一些有人居住的类型,例如,<代码>(t,…)= >结果< /代码>


通常,这种风格将涉及使用,即当处理程序的返回值是承诺时。这将启用一种编程风格,异步事件处理程序可以安全地相互通信,而无需显式的可变性。

您可以使用
let results=ref[]
创建对列表类型结果的引用。以便以后可以将其更新为
results:=new_元素::!结果
(如果原因语法正确)。虽然听起来不是很实用。。。你能提供你正在使用的
Http
模块的参考吗?这是我正在使用的完整代码,但一切都在进行中。非常感谢这些宝贵的反馈,我将研究这两种解决方案。再次感谢