如何在绑定到 Telethon 的异步函数中进行循环?

How can I do for in loop in async function binded to Telethon?

我想在绑定到具有模式 'get_data' 的 NewMessage 事件的异步定义函数中访问 Telethon 中的对话框和消息。总的来说,绑定有效并且我在 STDOUT 中得到 'hi' 响应,但是对于循环我没有得到 'hi2' 响应并且后面的代码没有被执行。我不确定我是否理解异步理论,但我们会看到。

我尝试了一些异步函数(比如睡眠、等待),将我的 client.start() 从事件绑定之前移动到事件绑定之后,在外部使用 for-in 循环执行函数并在异步定义中使用 await 调用它,并且没有任何效果。

client = TelegramClient('session', api_id, api_hash)
client.start()

print('1')
@client.on(events.NewMessage(pattern='get_data'))
async def get_data(event):
    await print('hi')
    print(client.iter_dialogs())
    for dialog in client.iter_dialogs():
        print('hi2')
        print(dialog.name)

        for message in client.iter_messages(dialog.id, reverse=True):
            entity = client.get_entity(message.sender_id)
            print('{0} {1}'.format(entity.first_name, entity.last_name), ':', message.text)
    await event.respond('Got data!')

client.run_until_disconnected()

我希望 for-in 循环的执行不会出错,因为我想进一步扩展这段代码。我希望它们以 /correct/ 方式执行 - 所以,当我 get_data 被调用时,我会让它们像普通程序一样执行,而不需要在内部进行异步操作(所以,这就是我想要等待的原因)。

也许我的尝试没问题,但我没有正确使用 Telethon?

for ... iter_messages 替换为 async for ... iter_messages,iter_dialogs 也相同。目前您不是 运行 异步代码。编辑:不要等待 print()