def call_later( # type: ignore[override] self, delay: float, callback: Callable[..., Any], *args: Any, context: contextvars.Context | None = None, ) -> asyncio.Handle: """Arrange for a callback to be called at a given time. Return a Handle: an opaque object with a cancel() method that can be used to cancel the call. The delay can be an int or float, expressed in seconds. It is always relative to the current time. Each callback will be called exactly once. If two callbacks are scheduled for exactly the same time, it undefined which will be called first. Any positional arguments after the callback will be passed to the callback when it is called. This uses `setTimeout(callback, delay)` """ if delay < 0: raise ValueError("Can't schedule in the past") h = asyncio.Handle(callback, args, self, context=context) def run_handle(): if h.cancelled(): return h._run() setTimeout(create_once_callable(run_handle), delay * 1000) return h
def call_later( self, delay: float, callback: Callable, *args, context: contextvars.Context = None ): """Arrange for a callback to be called at a given time. Return a Handle: an opaque object with a cancel() method that can be used to cancel the call. The delay can be an int or float, expressed in seconds. It is always relative to the current time. Each callback will be called exactly once. If two callbacks are scheduled for exactly the same time, it undefined which will be called first. Any positional arguments after the callback will be passed to the callback when it is called. This uses `setTimeout(callback, delay)` """ from js import setTimeout if delay < 0: raise ValueError("Can't schedule in the past") h = asyncio.Handle(callback, args, self, context=context) setTimeout(h._run, delay * 1000) return h
def test_import_invocation(): import js def temp(): print("okay?") js.setTimeout(temp, 100) js.fetch("packages.json")
def test_import_invocation(): import js def temp(): print("okay?") from pyodide import create_once_callable js.setTimeout(create_once_callable(temp), 100) js.fetch("packages.json")
def set_timeout(callback: Callable[[], None], timeout: int) -> int | JsProxy: """Wrapper for JavaScript's setTimeout() which automatically manages the lifetime of a JsProxy corresponding to the callback param. """ id = -1 def wrapper(): nonlocal id callback() TIMEOUTS.pop(id, None) callable = create_once_callable(wrapper) timeout_retval: int | JsProxy = setTimeout(callable, timeout) id = timeout_retval if isinstance(timeout_retval, int) else timeout_retval.js_id TIMEOUTS[id] = callable return timeout_retval