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

时间:2018-05-14 18:17:30

标签: ocaml reason bucklescript

我正在玩理性和buckelscript,作为练习,我为bibliography: - "../localtexmf/bibtex/bib/statistics.bib" - "../localtexmf/bibtex/bib/graphics.bib" - "../localtexmf/bibtex/bib/Rpackages.bib" 创建了绑定(https://nodejs.org/docs/latest-v8.x/api/http.html#http_http_get_options_callback

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

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回调中访问新绑定。你知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您的函数on的类型为

(t, [ | `_end(unit => unit) | `data(Buffer.t => unit)]) => unit

因此,如果您想在两次on调用之间建立通信通道,您唯一的选择是使用一些有效的计算,即mutable reference,I / O通道等

如果您想要遵循更具功能性的编程风格,那么您应该考虑将处理程序的返回类型更改为某些有人居住的类型,例如(t, ...) => result

通常,这种样式将涉及使用Promises,即,当处理程序的返回值是promise时。这实现了一种编程风格,其中异步事件处理程序可以安全地相互通信而没有明显的可变性。

答案 1 :(得分:0)

我设法使用此代码

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,
                    ),
                ),
              );
         },
       ),
     );
});

它有效,但我确信这不是最有效的方法。