In your second example, I am not sure why you are re-assigning model data to the model itself using `buildRenderableData`. Is not a good practice to have data stored twice in the Model as it can go out of sync.
Assuming that the assignment is not needed, you can remove all the if condition in the `update` and just let the view to detect when all 4 responses are completed. So your update will simply be:
```
update : Msg -> ( Model, Cmd Msg )
update msg model =
case msg of
FirstThingLoaded data ->
( { model | data1 = data }, Cmd.none )
SecondThingLoaded data ->
( { model | data2 = data }, Cmd.none )
ThirdThingLoaded data ->
( { model | data3 = data }, Cmd.none )
FourthThingLoaded data ->
( { model | data4 = data }, Cmd.none )
```
If we instead assume that this data need some heavy pre-processing operation and you want to cache it in the model to increase performances, you can still do it with only one if condition, for example wrapping the `update` function.
```
updateWrapper : Msg -> ( Model, Cmd Msg )
updateWrapper msg model =
let
(newModel, cmd ) = update msg model
in
if isJust model.data1 && isJust model.data2 && isJust model.data3 && isJust model.data4 then
( doSomeHeavyPreProcessingIfNecessary newModel, cmd )
else
( newModel, cmd )
```
I am sure there is a smarter solution than this, but this is the first that came to my mind.