es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Argumentos opcionales para funciones de orden superior

Intento escribir un enlace para socket.io.

Tengo problemas con una función (next() en mi código de ejemplo) que puede tomar un argumento o no tomar ninguno o un objeto de error (Js.Exn.raiseError("ERROR!")).

No encuentro una forma de definir una firma de función que pueda tomar ambos tipos de argumentos como el primer valor.

Incluso no estoy seguro de si lo que estoy pidiendo es posible en rescript, cualquier ayuda para resolver ese problema de la manera apropiada en rescript, sería apreciada.

Mi implementación actual se ve así:

type server
type socket
type next = (. unit) => unit 

@new @module("socket.io") external socketIO: unit => server = "Server"
@send external use: (server, (socket, next) => unit) => unit = "use"
@send external listen: (server, int) => unit = "listen"
@send external on: (server, @string [ #connection(socket => unit) ] ) => unit = "on"

let io = socketIO()

io->use((socket, next) => {
    Js.log("PRIMERO")
    next(.)
})

io->use((socket, next) => {
    Js.log("SEGUNDO")
    next(.)
})

io->on(#connection(socket => 
    Js.log("CONECTADO")
))

io->listen(3000)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Escribiendo un Binding para Socket.io en ReScript

    Como experto en ReScript con especialización en interoperabilidad (interop), ffi y funciones de orden superior, estoy tratando de escribir un binding para socket.io, pero me estoy enfrentando a un problema con una función.

    La función next() en mi código no recibe argumentos o recibe un objeto de error (Js.Exn.raiseError("ERROR!")). Sin embargo, no puedo encontrar una forma de definir una firma de función que pueda tomar ambos tipos de argumentos como primer valor.

    No estoy seguro de si tal cosa es posible en ReScript. Por lo tanto, estoy buscando ayuda para resolver este problema de la manera adecuada en ReScript.

    Aquí está mi implementación actual:

    type server
    type socket
    type next = (. unit) => unit 
    
    @new @module("socket.io") external socketIO: unit => server = "Server"
    @send external use: (server, (socket, next) => unit) => unit = "use"
    @send external listen: (server, int) => unit = "listen"
    @send external on: (server, @string [ #connection(socket => unit) ] ) => unit = "on"
    
    let io = socketIO()
    
    io->use((socket, next) => {
        Js.log("FIRST")
        next(.)
    })
    
    io->use((socket, next) => {
        Js.log("SECOND")
        next(.)
    })
    
    io->on(#connection(socket => 
        Js.log("CONNECT")
    ))
    
    io->listen(3000)
    

    Agradecería cualquier solución o guía sobre cómo resolver este problema.

Comments are closed.