在扣脚本中定义一个闭合变量

我正在尝试将以下ES6脚本转换为带扣脚本,但我终生无法弄清楚如何在带扣脚本中创建“关闭”

    import {Socket,Presence} from "phoenix"

    let socket = new Socket("/socket",{
      params: {user_id: window.location.search.split("=")[1]}
    })

    let channel = socket.channel("room:lobby",{})
    let presence = new Presence(channel)

    function renderOnlineUsers(presence) {
      let response = ""

      presence.list((id,{metas: [first,...rest]}) => {
        let count = rest.length + 1
        response += `<br>${id} (count: ${count})</br>`
      })

      document.querySelector("main[role=main]").innerHTML = response
    }

    socket.connect()

    presence.onSync(() => renderOnlineUsers(presence))

    channel.join()

我无法明确指出的部分是let response = ""(或var,在这种情况下,因为扣脚本始终使用var s)

    function renderOnlineUsers(presence) {
      let response = ""

      presence.list((id,...rest]}) => {
        let count = rest.length + 1
        response += `<br>${id} (count: ${count})</br>`
      })

      document.querySelector("main[role=main]").innerHTML = response
    }

到目前为止,我获得的最接近值不包括result声明

...
...

let onPresenceSync ev =
  let result = "" in
    let listFunc = [%raw begin
        {|
          (id,...rest]}) => {
            let count = rest.length + 1
            result += `${id} (count: ${count})\n`
          }
        |}
      end
    ] in
      let _ =
        presence |. listPresence (listFunc) in
          [%raw {| console.log(result) |} ]
...
...

编译为:

function onPresenceSync(ev) {
  var listFunc = (
          (id,...rest]}) => {
            let count = rest.length + 1
            result += `${id} (count: ${count})\n`
          }
        );
  presence.list(listFunc);
  return ( console.log(result) );
}
greatmrr 回答:在扣脚本中定义一个闭合变量

result由于被认为是未使用的优化而被删除。通常,使用依赖于BuckleScript生成的代码的raw代码不是一个好主意,因为在生成的代码中会遇到很多惊喜。

对编译器认为不可变的变量进行突变也不是一个好主意,因为它将基于该值永远不变的假设进行优化。

这里最简单的解决方法是将[%raw {| console.log(result) |} ]替换为Js.log result,但看看如何用OCaml编写listFunc可能会很有启发性:

let onPresenceSync ev =
  let result = ref "" in
  let listFunc = fun [@bs] id item ->
    let count = Js.Array.length item##meta in
    result := {j|$id (count: $count)\n|j}
  in
  let _ = presence |. (listPresence listFunc) in
    Js.log !result

请注意,result现在是一个ref单元格,这是在OCaml中指定可变变量的方式。使用ref更新:=单元,并使用!检索其包含的值。还要注意[@bs]批注,用于指定传递给外部高阶函数的函数所需的an uncurried function。以及所使用的字符串插值语法:{j| ... |j}

本文链接:https://www.f2er.com/2981551.html

大家都在问