compas.utilities.await_callback(async_func, callback_name='callback', errback_name=None, *args, **kwargs)[source]

Wait for the completion of an asynchronous code that uses callbacks to signal completion.

This helper function turns an async function into a synchronous one, waiting for its completion before moving forward (without doing a busy wait).

It is useful to minimize “callback hell” when more advanced options like asyncio are not available.

  • async_func (callable) – An asynchronous function that receives at least one callback parameter to signal completion.

  • callback_name (string, optional) – Name of the callback parameter of async_func.

  • errback_name (string, optional) – Name of the error handling callback parameter of async_func.




Exceptions thrown during the async execution are handled and re-thrown as normal exceptions, even if they were raised on a different thread.


The following example shows how to await an async function (do_async_stuff in the example), using this utility:

from compas.utilities import await_callback

def do_async_stuff(callback):
    from threading import Thread

    def runner(cb):
        print('doing async stuff')
        # ..

    Thread(target=runner, args=(callback, )).start()

result = await_callback(do_async_stuff)