in go/showcase/pkg/showcase/part5/asyncops.go [59:89]
func (a AsyncOpsFn) Invoke(ctx statefun.Context, message statefun.Message) error {
username := ctx.Self().Id
ageChannel := getAgeFromRemoteDb(ctx, username)
friendsChannel := getFriendsListFromAnotherRemoteDatabase(ctx, username)
var age int32
var friends []string
finished := false
for !finished {
select {
case <-ctx.Done():
return ctx.Err()
case age = <-ageChannel:
if friends != nil {
finished = true
}
case friends = <-friendsChannel:
if age != 0 {
finished = true
}
}
}
ctx.Storage().Set(a.UserAge, age)
ctx.Storage().Set(a.FriendsList, friends)
return nil
}