Handle asyncronus javascript calls from GDScript

Godot Version



Hi, I’m trying to get a String from a database using JavaScriptBridge calling a function called getOpenField() which uses a “Promise” object and I don’t know how to handle that object from GDScript. With this I mean wait for the promise state to be " fulfilled" and then get the String from that object.

I think once you have the promise JavaScript object you need to call then method with a fulfilled callback and a rejection callback.

Js_promise.then(success_cb, failed_cb)

func success_cb(args):
Func failed_cb(args):

I think I’m not understanding something because if I use the then function from GDScript like this

var openField= JavaScriptBridge.eval("getOpenField()")
openField.then(success_cb, failed_cb)

It gives me this error

USER SCRIPT ERROR: Invalid call. Nonexistent function ‘then’ in base ‘Nil’.

But if I create a callback and call it from the JavaScriptBridge.eval like this

var js_Callback_success = JavaScriptBridge.create_callback(success_cb)
var js_Callback_failed = JavaScriptBridge.create_callback(failed_cb)

func _ready():

func success_cb(args):
func failed_cb(args):

ReferenceError: success_cb is not defined

I’ve tried calling from the eval using both GDScript var js_Callback_success and success_cb and the error message is the same

this is probably because javascriptbridge.eval() returns a Variant, and Godot doesn’t have a promise Variant class.

you need a JavaScriptObject class which is usually gotten with JavaScriptBridge.get_interface(<interface string>)

You may need to create a custom interface that will wrap your function with a the promise. and you can abstract the then function.

// suedo js
const MyInterface = {
    getOpenField: function () { },
    then: function (args) { },
# suedo gd
var my_interface : JavaScriptObject = JavaScriptBridge.get_interface("MyInterface")

There are also other means to setup callbacks documented in the JavaScriptBridge class.


this is because i did not define a valid function body for the callback in my post. just replace the three periods with the pass keyword if you don’t have a function in mind yet. (I was attempting to convey that you will implement whatever you need.)

func success_cb(args):