问题描述
好的,我正在使用 MongoDB Realm 函数,这是一个无服务器平台,您可以像这样定义函数:
exports = async function(param1,param2){
var result = {}
// do stuff
return result;
}
if (typeof module === 'object') {
module.exports = exports;
}
我想问一下是否可以在 Elm 函数中编写代码并在 nodejs 运行时中运行它?换句话说就是这样:
exports = async function(param1,param2){
var result = {}
// do stuff
// call elm compiled js
return elmFunction(param1,param2);
}
var elmFunction = async function(param1,param2) {
// generator elm code
};
解决方法
是的,但可能有点棘手。
首先,您需要使用 Platform.worker
设置 Elm 文件 - 这基本上是一个无头 Elm 程序。
您通常会将同步可用的输入(在您的示例中为 param1
和 param2
)作为标志传递。然后,您将定义一个输出端口,您将在 Elm 程序完成时调用该端口。在 JS 方面,你会这样处理:
exports = async function(param1,param2){
const elmProgram = Elm.Main.init({flags: {param1,param2}});
return new Promise((resolve) => {
elmProgram.ports.outputPort.subscribe((result) => {
resolve(result);
});
});
}
Elm 代码可能如下所示(假设您的代码是纯代码):
port module Main exposing (main)
import Json.Decode exposing (Value)
import Json.Encode
port outputPort : Value -> Cmd msg
main =
Platform.worker
{ init = init,subscriptions = always Sub.none,update = \msg model -> (model,Cmd.none)
}
init flags =
case Json.Decode.decodeValue flagsDecoder flags of
Ok input ->
let
result =
myFunction input
in
((),outputPort (resultEncoder result))
Err e ->
Debug.todo "error handling"