Como sabe, hay ciertos casos (por ejemplo, uso en trabajadores) en los que las funciones deben ser serializables (y, por otro lado, deserializables, por supuesto). Tengo un caso así; una función de biblioteca (es decir, no puedo cambiarla) doSomething(serializableFunction) espera tal función de mí. También espera que serializableFunction acepte 1 parámetro x y le dé x .
Hasta ahora, esto no fue un problema para mí; Tenía una función f(x) de otra biblioteca que cumplía con mis propósitos (así que solo llamé a doSomething(f) hasta ahora). Pero ahora, tengo una segunda función serializable g(x) , también de una biblioteca, y quiero que la función que le doy a doSomething se ejecute ya sea f o g , dependiendo de x . Así que probé:
doSomething(function h(x) { if (x < 5) return f(x); else return g(x); }); Esto funcionaría bien sin serialización, pero con él, se arroja un error, por supuesto, porque h ya no es serializable: ¡Llama a f y g , que ya no se conocen en el momento de la deserialización!
Así que actualmente estoy haciendo:
doSomething(eval(`function h(x) { const f = ${f.toString()}; const g = ${g.toString()}; if (x < 5) return f(x); else return g(x); }`)); ¡Esto funciona, pero es una pesadilla! Entonces, mi pregunta es: ¿hay algún enfoque mejor para fusionar 2 funciones serializables (como f y g ) en 1 función que también sea serializable? Tenga en cuenta que no puedo cambiar ninguno de f , g o doSomething , solo h !
Pienso en una solución que reemplace eval con new Funciton . No es el mejor, pero un poco mejor.
Ejemplo a continuación:
function f(a) { console.log("f", a); } function g(b) { console.log("f", b); } function doSomething(func) { const y = 1; func(y); } const funcBody = `return function () { const f = ${f.toString()}; const g = ${g.toString()}; if (x < 5) return f(x); else return g(x); }()`; const func = new Function("x", funcBody); doSomething(func);O puede agregar algo de abstracción como a continuación:
function f(a) { console.log("f", a); } function g(b) { console.log("f", b); } function doSomething(func) { const y = 1; func(y); } const getFuncArray = (name = "x") => [ name, `return function () { const f = ${f.toString()}; const g = ${g.toString()}; if (${name} < 5) return f(${name}); else return g(${name}); }()`, ]; const res = new Function(...getFuncArray()); doSomething(res);