Sagas are complex, but it is necessary to understand why they are used. Saga patterns are used to handle transactional problems between microservices. Think of the commit and rollback actions in a database. You would perform them locally. This behavior is remotely implemented by Sagas.
Following the pattern, for example, when the Order microservice triggers the OrderCreated event, the Inventory microservice will listen for OrderCreated and perform inventory operations. If all items are available, PreStockDone will be triggered, but if some are not, then UnauthorizedStock will be triggered. The Order microservice will listen to both events and update the order accordingly: continue with the order when PreStockDone, or cancel the order when UnauthorizedStock.
This means that events will happen at some point, but not immediately. Given this, your response to the user will always be the first step of the Saga. On the mentioned example, it would be the newly created order, regardless of the stock verification. In this case, you should inform the user, "Thank you for your purchase. We have received your order, and it will be processed soon!"
Remember, in data storage, transactions refer to the modifications applied to entities. Sagas are used only in this case.
Therefore, when you need a microservice to retrieve data from another microservice, you should establish synchronous communication. You can use the HTTP protocol, gRPC, or any other protocol.
In optimized systems, for example, it is common to have a dedicated database for queries (ElasticSearch, MongoDB, etc.). In this case, you would have a new microservice, such as OrderReports, which would receive all the data already formed from events and publish it in its own read database. And in this case, instead of reading orders directly in the Order microservice, you would read them directly in the OrderReports microservice.