/ client_code / utils / _writeback_waiter.py
_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