Код: Выделить всё
def get_contract_listener(access_token: str, callback: Callable[[int | None], Awaitable[None]]) -> None | Watch:
logger.debug('get contract listener')
contract = db.collection('Contract').where(filter=FieldFilter('access_token', '==', access_token)).get()
async def wrap(document: DocumentSnapshot):
await callback(123)
return cast(DocumentReference, contract[0].reference).on_snapshot(lambda doc, _, __: run(wrap(doc[0])))
async def api_websocket_wait_update(socket: WebSocket):
await socket.accept()
global first
first = True
token = socket.cookies.get('access_token')
async def callback(balance: int | None) -> None:
assert listener is not None
global first
if first:
first = False
return
await socket.send_json({'message': 'updated', 'balance': balance})
await socket.close(1000)
listener.unsubscribe()
# return ??
listener = get_contract_listener(token, callback)
await socket.send_json({'message': 'accepted'})
while True:
sleep(5)
Если я просто вернусь, я прерву только обратный вызов.
Аналогичный вопрос для JS (но они запускали функцию из оригинала, но в этой ситуации я запускаю ее из обратного вызова прослушивателя)
p.s некоторые проверки кода удалены (например, существует контракт или предоставлен токен доступа), потому что stackoverflow говорит, что «ваш вопрос в основном состоит из кода»
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-function
Мобильная версия