如何在两个事件处理程序之间共享数据?
How to share data between two event handler?
我正在玩 reason 和 buckelscript,作为练习,我为 http.get
(https://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
回调访问。你知道如何解决这个问题吗?
我使用这段代码成功做到了
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,
),
),
);
},
),
);
});
它有效,但我很确定这不是最有效的方法。
您的函数 on
的类型为
(t, [ | `_end(unit => unit) | `data(Buffer.t => unit)]) => unit
因此,如果您想在对 on
的两次调用之间建立通信通道,您唯一的选择就是使用一些副作用计算,即 mutable reference、I/O频道等
如果你想坚持更函数式的编程风格,那么你应该考虑将你的处理程序的 return 类型更改为一些常驻类型,例如 (t, ...) => result
通常,这种风格将涉及使用 Promises,即当处理程序的 return 值是一个承诺时。这实现了一种编程风格,其中异步事件处理程序可以安全地相互通信而无需显式可变性。
我正在玩 reason 和 buckelscript,作为练习,我为 http.get
(https://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
回调访问。你知道如何解决这个问题吗?
我使用这段代码成功做到了
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,
),
),
);
},
),
);
});
它有效,但我很确定这不是最有效的方法。
您的函数 on
的类型为
(t, [ | `_end(unit => unit) | `data(Buffer.t => unit)]) => unit
因此,如果您想在对 on
的两次调用之间建立通信通道,您唯一的选择就是使用一些副作用计算,即 mutable reference、I/O频道等
如果你想坚持更函数式的编程风格,那么你应该考虑将你的处理程序的 return 类型更改为一些常驻类型,例如 (t, ...) => result
通常,这种风格将涉及使用 Promises,即当处理程序的 return 值是一个承诺时。这实现了一种编程风格,其中异步事件处理程序可以安全地相互通信而无需显式可变性。