_writeback_waiter.py
1 # SPDX-License-Identifier: MIT 2 # 3 # Copyright (c) 2021 The Anvil Extras project team members listed at 4 # https://github.com/anvilistas/anvil-extras/graphs/contributors 5 # 6 # This software is published at https://github.com/anvilistas/anvil-extras 7 8 from functools import wraps as _wraps 9 from time import sleep as _sleep 10 11 from anvil import Component as _Component 12 from anvil.js import window as _window 13 14 from ._deferred import Deferred as _Deferred 15 16 __version__ = "3.1.0" 17 18 _active_writebacks = [] 19 20 21 class _WritebackWaiter: 22 def __init__(self): 23 self.deferred = _Deferred() 24 25 def __enter__(self): 26 _active_writebacks.append(self.deferred) 27 28 def __exit__(self, exc, *args): 29 global _active_writebacks 30 deferred = self.deferred 31 _active_writebacks = [d for d in _active_writebacks if d is not deferred] 32 self.deferred.resolve() 33 34 35 _old_raise = _Component.raise_event 36 37 38 def raise_event(self, event_name, **kws): 39 if not event_name.startswith("x-anvil-write-back"): 40 return _old_raise(self, event_name, **kws) 41 with _WritebackWaiter(): 42 return _old_raise(self, event_name, **kws) 43 44 45 _Component.raise_event = raise_event 46 47 48 def wait_for_writeback(fn): 49 @_wraps(fn) 50 def wrapper(self, *args, **kws): 51 _sleep(0) 52 _window.Promise.allSettled([d.promise for d in _active_writebacks]) 53 return fn(self, *args, **kws) 54 55 return wrapper