Quick answer: Use sequential default. Or call .chain() after a parallel block to enforce ordering.
tween_property fades, then tween_callback should fire. They run together because parallel mode was on.
The Fix
# Sequential default
var tw = create_tween()
tw.tween_property(node, "modulate:a", 0.0, 0.5)
tw.tween_callback(self.on_faded) # after fade completes
# Mixed
var tw2 = create_tween().set_parallel(true)
tw2.tween_property(node, "modulate:a", 0.0, 0.5)
tw2.tween_property(node, "position", target, 0.5)
tw2.chain().tween_callback(self.on_done) # after both
chain() inserts a sequential boundary. Useful in mixed parallel/sequential pipelines.
Verifying
Callback fires after fade completes. Without chain in parallel block: fires concurrently.
“Sequential default. chain() boundary.”
Related Issues
For Tween parallel, see parallel. For Tween bounce, see bounce.
chain() orders. Callback last.