rx.call_script callback needs to await promises (#2121)

This commit is contained in:
Masen Furer 2023-11-02 14:37:02 -07:00 committed by GitHub
parent 4a526620ac
commit b313aaf3ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 4 deletions

View File

@ -28,6 +28,10 @@ def CallScript():
inline_counter += 1 inline_counter += 1
return {inline3: 42, a: [1, 2, 3], s: 'js', o: {a: 1, b: 2}} return {inline3: 42, a: [1, 2, 3], s: 'js', o: {a: 1, b: 2}}
} }
async function inline4() {
inline_counter += 1
return "async inline4"
}
""" """
external_scripts = inline_scripts.replace("inline", "external") external_scripts = inline_scripts.replace("inline", "external")
@ -47,6 +51,7 @@ def CallScript():
yield rx.call_script("inline1()") yield rx.call_script("inline1()")
yield rx.call_script("inline2()") yield rx.call_script("inline2()")
yield rx.call_script("inline3()") yield rx.call_script("inline3()")
yield rx.call_script("inline4()")
def call_script_inline_return(self): def call_script_inline_return(self):
return rx.call_script("inline2()") return rx.call_script("inline2()")
@ -61,6 +66,9 @@ def CallScript():
yield rx.call_script( yield rx.call_script(
"inline3()", callback=CallScriptState.call_script_callback "inline3()", callback=CallScriptState.call_script_callback
) )
yield rx.call_script(
"inline4()", callback=CallScriptState.call_script_callback
)
def call_script_inline_return_callback(self): def call_script_inline_return_callback(self):
return rx.call_script( return rx.call_script(
@ -85,6 +93,7 @@ def CallScript():
yield rx.call_script("external1()") yield rx.call_script("external1()")
yield rx.call_script("external2()") yield rx.call_script("external2()")
yield rx.call_script("external3()") yield rx.call_script("external3()")
yield rx.call_script("external4()")
def call_script_external_return(self): def call_script_external_return(self):
return rx.call_script("external2()") return rx.call_script("external2()")
@ -99,6 +108,9 @@ def CallScript():
yield rx.call_script( yield rx.call_script(
"external3()", callback=CallScriptState.call_script_callback "external3()", callback=CallScriptState.call_script_callback
) )
yield rx.call_script(
"external4()", callback=CallScriptState.call_script_callback
)
def call_script_external_return_callback(self): def call_script_external_return_callback(self):
return rx.call_script( return rx.call_script(
@ -300,7 +312,7 @@ def test_call_script(
yield_button.click() yield_button.click()
update_counter_button.click() update_counter_button.click()
assert call_script.poll_for_value(counter, exp_not_equal="0") == "3" assert call_script.poll_for_value(counter, exp_not_equal="0") == "4"
reset_button.click() reset_button.click()
assert call_script.poll_for_value(counter, exp_not_equal="3") == "0" assert call_script.poll_for_value(counter, exp_not_equal="3") == "0"
return_button.click() return_button.click()
@ -311,10 +323,11 @@ def test_call_script(
yield_callback_button.click() yield_callback_button.click()
update_counter_button.click() update_counter_button.click()
assert call_script.poll_for_value(counter, exp_not_equal="0") == "3" assert call_script.poll_for_value(counter, exp_not_equal="0") == "4"
assert call_script.poll_for_value( assert call_script.poll_for_value(
results, exp_not_equal="[]" results, exp_not_equal="[]"
) == '["%s1",null,{"%s3":42,"a":[1,2,3],"s":"js","o":{"a":1,"b":2}}]' % ( ) == '["%s1",null,{"%s3":42,"a":[1,2,3],"s":"js","o":{"a":1,"b":2}},"async %s4"]' % (
script,
script, script,
script, script,
) )

View File

@ -201,7 +201,11 @@ export const applyEvent = async (event, socket) => {
try { try {
const eval_result = eval(event.payload.javascript_code); const eval_result = eval(event.payload.javascript_code);
if (event.payload.callback) { if (event.payload.callback) {
eval(event.payload.callback)(eval_result) if (!!eval_result && typeof eval_result.then === 'function') {
eval(event.payload.callback)(await eval_result)
} else {
eval(event.payload.callback)(eval_result)
}
} }
} catch (e) { } catch (e) {
console.log("_call_script", e); console.log("_call_script", e);