I have a scenario where I have one Effect that returns an array of [String]. I then pass that to my Networking Effect which makes an API request and returns a Decodable Output, which is what I ultimately want to use to make a decision and return an Action. Is there a way to chain Effects together where you can use the Output of one Effect and pass it to another Effect, without needing to return an Action between the Effects?
Malauch
2
If your effects are based on Combine publishers, then .flatMap operator is what you need to use. If your effects are based on async/await dependencies endpoints then just call them in Effect.run { send in } and send action in the end.
Unfortunately they are Async/Await based. Not possible using that?
Malauch
4
If async/await then it depends it they are function or AsyncStream. If normal async function then try something it like this:
case .fetchItems:
return .run { send in
let payload = await self.preparePayload() // returns [String]
let response = await self.apiClient.fetchFor(payload) // returns Decodable Output
send(.updateItems(response))
}
If your endpoints are AsyncStreams, then await/reduce/map/flatMap them in .run { send in } as you need and in then use send(.action(finalDataReadyToBeSendToAction)).
When dealing with async/await endpoints then it's all like handling this as a normal swift concurrency in Effect.run.
1 Like
Great, that worked. Thank you!