Shamoon
Shamoon

Reputation: 43501

How would I structure a complex if / then chain with promises?

Specifically, bluebird compatible promises

pseudo code is shown below

if authentication
  db.findUser(authentication.userId).then (dbUser) ->
    sessionLogin dbUser
    # Done!
else
  if isSession req.user
    db.findUser(req.user.id).then (dbUser) ->
      db.addUserAuth(req.user.id, authentication).then (dbAuth) ->
        return
  else
    db.createUser(userDetails).then (dbUser) ->
      db.addUserAuth(dbUser.id, authentication).then (dbAuth) ->
        return

# Once all of that is done, do the following

if cookieSet
  db.findInvite(cookie.invitation).then (dbInvitation) ->
    if dbInvitation.Team
      db.createTeamMember(dbInvitation.Team, dbUser.id).then ->
        db.updateInvitation(marked: true).then ->
          done
    else
      done
else
  done

I am not looking necessarily for exact code, pseudo code or an idea will do fine. This is written in CoffeeScript, by the way, although that shouldn't matter.

Upvotes: 1

Views: 62

Answers (2)

Benjamin Gruenbaum
Benjamin Gruenbaum

Reputation: 276306

Well, promises chain but they don't magically abstract branching logic like if/else - you'd still use conditionals for that. Your code is very callbacky though - you can utilize the fact promises are proxies for values and greatly simplify it:

if authentication
  user = db.findUser(authentication.userId)
  user_login = user.then (dbUser) -> sessionLogin dbUser 
  auth_user = user.return(user_login).return(user) # wait but keep value
else
  user = db.findUser(req.user.id) if isSession req.user else db.createUser(userDetails)
  auth_user = user.then(user->db.addUserAuth(req.user.id, authentication)).return(user)

auth_user.then (user) -> 
  if cookieSet
    db.findInvite(cookie.invitation)
.then (invite) ->
    if invite and invite.Team
      db.createTeamMember(dbInvitation.Team, dbUser.id)
.then val ->
   db.updateInvitation(marked: true) if val

Upvotes: 3

Bergi
Bergi

Reputation: 664538

It wouldn't look much different actually, just put the promises together:

(if authentication
  db.findUser(authentication.userId).then (dbUser) ->
    sessionLogin dbUser
    .return dbUser
else
  (if isSession req.user
    db.findUser(req.user.id)
  else
    db.createUser(userDetails)
  ).then (dbUser) ->
    db.addUserAuth(dbUser.id, authentication)
    .return dbUser
).then (dbUser) ->
  if cookieSet
    db.findInvite(cookie.invitation).then (dbInvitation) ->
      if dbInvitation.Team
        db.createTeamMember(dbInvitation.Team, dbUser.id).then ->
          db.updateInvitation(marked: true)
.then ->
  done

Upvotes: 1

Related Questions