1

我正在玩理性和 buckelscript,作为练习,我为http.gethttps://nodejs.org/docs/latest-v8.x/api/http.html#http_http_get_options_callback)创建了绑定

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

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

4

2 回答 2

2

你的函数on有类型

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

因此,如果您想在两次调用之间建立通信通道,on您唯一的选择就是使用一些副作用计算,即可变引用、I/O 通道等。

如果你想坚持更函数化的编程风格,那么你应该考虑将你的处理程序的返回类型更改为一些有人居住的类型,例如,(t, ...) => result

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

于 2018-05-14T19:14:49.620 回答
0

I managed to do it using this code

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

It works, but I'm quite sure this is not the most efficient way to do it.

于 2018-05-14T18:52:09.900 回答