Bird
Raised Fist0
GraphQLquery~10 mins

Subscription resolvers in GraphQL - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Subscription resolvers
Client subscribes to event
↓
Server receives subscription request
↓
Subscription resolver sets up event listener
↓
Event occurs on server
↓
Resolver pushes updated data to client
↓
Client receives real-time update
↓
Subscription stays open until client disconnects
The flow shows how a client subscribes to real-time events, the server listens and sends updates as events happen.
Execution Sample
GraphQL
subscription {
  messageAdded {
    id
    content
    author
  }
}
Client subscribes to new messages; server sends each new message as it arrives.
Execution Table
StepActionResolver StateEvent Occurred?Data Sent to Client
1Client sends subscription requestWaiting for eventsNoNo data
2Server sets up subscription resolverListening for messageAdded eventsNoNo data
3New messageAdded event occursListeningYesNew message data sent
4Client receives new messageListeningNoData received
5Another messageAdded event occursListeningYesNew message data sent
6Client disconnectsSubscription closedNoNo data
💡 Client disconnects, subscription resolver stops sending data
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 5Final
subscriptionStateNoneListeningListeningListeningClosed
eventDataNoneNoneMessage 1Message 2None
clientConnectionDisconnectedConnectedConnectedConnectedDisconnected
Key Moments - 3 Insights
Why does the subscription resolver keep running after sending data once?
Because subscriptions are designed to keep the connection open and send data every time the event occurs, as shown in steps 3 and 5 in the execution_table.
What happens if the client disconnects?
The subscription resolver stops sending data and closes the connection, as shown in step 6 in the execution_table.
Does the server send data before any event occurs?
No, the server only sends data when the subscribed event happens, shown by 'No data' in steps 1 and 2.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the resolver state after the client sends the subscription request?
AListening for messageAdded events
BWaiting for events
CSubscription closed
DDisconnected
💡 Hint
Check Step 1 and Step 2 in the execution_table under Resolver State
At which step does the client receive the first real-time update?
AStep 2
BStep 3
CStep 4
DStep 5
💡 Hint
Look for 'Client receives new message' in the execution_table
If the client disconnects earlier, how does the subscriptionState variable change in variable_tracker?
AIt changes to 'Closed'
BIt becomes 'None'
CIt stays 'Listening'
DIt becomes 'Disconnected'
💡 Hint
See the 'subscriptionState' row in variable_tracker at the Final column
Concept Snapshot
Subscription resolvers handle real-time data by keeping a connection open.
Client subscribes to an event.
Server listens and sends data when events occur.
Connection stays open until client disconnects.
Used for live updates like chat messages or notifications.
Full Transcript
Subscription resolvers in GraphQL allow clients to receive real-time updates. The client sends a subscription request, and the server sets up a resolver that listens for specific events. When an event occurs, the server pushes updated data to the client. This connection remains open, sending data whenever new events happen, until the client disconnects. This flow enables live data features such as chat messages or notifications.

Practice

(1/5)
1. What is the main purpose of a subscription resolver in GraphQL?
easy
A. To modify data on the server
B. To fetch data only once when a query is made
C. To provide real-time updates to clients when data changes
D. To define the schema types

Solution

  1. Step 1: Understand the role of subscription resolvers

    Subscription resolvers are designed to send data updates automatically as events happen, unlike queries which fetch data once.
  2. Step 2: Compare with other resolver types

    Queries fetch data once, mutations modify data, and schema defines types. Only subscriptions provide live updates.
  3. Final Answer:

    To provide real-time updates to clients when data changes -> Option C
  4. Quick Check:

    Subscription = real-time updates [OK]
Hint: Subscriptions push live data updates automatically [OK]
Common Mistakes:
  • Confusing subscriptions with queries
  • Thinking subscriptions modify data
  • Mixing schema definition with resolver purpose
2. Which of the following is the correct way to declare a subscription resolver in GraphQL SDL?
easy
A. type Subscription { newMessage: Message }
B. type Query { newMessage: Message }
C. type Mutation { newMessage: Message }
D. type Resolver { newMessage: Message }

Solution

  1. Step 1: Identify the correct GraphQL operation keyword

    Subscriptions use the type Subscription keyword to declare real-time data streams in the schema.
  2. Step 2: Check other operation keywords

    Queries use type Query, mutations use type Mutation, and type Resolver is not a valid keyword.
  3. Final Answer:

    type Subscription { newMessage: Message } -> Option A
  4. Quick Check:

    Subscription keyword = subscription declaration [OK]
Hint: Use 'type Subscription' keyword to declare live data streams [OK]
Common Mistakes:
  • Using 'type Query' or 'type Mutation' instead of 'type Subscription'
  • Trying to use 'type Resolver' keyword
  • Misplacing subscription declaration outside schema
3. Given this subscription resolver code snippet, what will be the output when a new message is published?
const resolvers = {
  Subscription: {
    newMessage: {
      subscribe: () => pubsub.asyncIterator(['MESSAGE_ADDED'])
    }
  }
};
medium
A. The client receives updates only when a message is added
B. The client receives all past messages immediately
C. The client receives no updates until a query is made
D. The client receives an error because subscribe is missing

Solution

  1. Step 1: Understand the subscribe function

    The subscribe function returns an async iterator for the event 'MESSAGE_ADDED', so it listens for new messages.
  2. Step 2: Determine what triggers updates

    Updates are sent only when the 'MESSAGE_ADDED' event occurs, so clients get notified only on new messages.
  3. Final Answer:

    The client receives updates only when a message is added -> Option A
  4. Quick Check:

    Subscription triggers on event = client updates [OK]
Hint: Subscribe returns async iterator for live event updates [OK]
Common Mistakes:
  • Assuming all past data is sent immediately
  • Thinking updates require queries first
  • Missing that subscribe returns async iterator
4. Identify the error in this subscription resolver code:
const resolvers = {
  Subscription: {
    newNotification: {
      subscribe: pubsub.asyncIterator('NOTIFICATION_ADDED')
    }
  }
};
medium
A. The resolver key should be 'Query' instead of 'Subscription'
B. The event name should be an array, not a string
C. Subscription resolvers cannot use pubsub
D. The subscribe function should be a function returning asyncIterator, not the asyncIterator itself

Solution

  1. Step 1: Check the subscribe property type

    The subscribe property must be a function that returns the async iterator, not the async iterator itself.
  2. Step 2: Verify correct usage of asyncIterator

    It should be subscribe: () => pubsub.asyncIterator('NOTIFICATION_ADDED') to work properly.
  3. Final Answer:

    The subscribe function should be a function returning asyncIterator, not the asyncIterator itself -> Option D
  4. Quick Check:

    Subscribe must be a function returning asyncIterator [OK]
Hint: Subscribe must be a function returning asyncIterator [OK]
Common Mistakes:
  • Assigning asyncIterator directly instead of a function
  • Using string instead of array for event names (optional)
  • Confusing subscription with query resolvers
5. You want to create a subscription that only sends updates to clients when a new comment is added to a specific post ID. Which resolver implementation correctly filters events by post ID?
const resolvers = {
  Subscription: {
    commentAdded: {
      subscribe: (parent, args, { pubsub }) => {
        return pubsub.asyncIterator('COMMENT_ADDED');
      },
      resolve: (payload, args) => {
        if (payload.postId === args.postId) {
          return payload;
        }
        return null;
      }
    }
  }
};
hard
A. The filtering should be done inside the subscribe function, not resolve
B. This implementation correctly filters comments by postId in the resolve function
C. The asyncIterator should listen to an array of post IDs, not a single event
D. Subscriptions cannot filter events by arguments

Solution

  1. Step 1: Understand event filtering in subscriptions

    The resolve function can filter events by checking if the payload matches the subscription arguments.
  2. Step 2: Check the given code logic

    The code returns the payload only if payload.postId === args.postId, otherwise returns null to skip irrelevant events.
  3. Final Answer:

    This implementation correctly filters comments by postId in the resolve function -> Option B
  4. Quick Check:

    Filtering in resolve function = correct approach [OK]
Hint: Filter events in resolve by comparing payload and args [OK]
Common Mistakes:
  • Trying to filter inside subscribe instead of resolve
  • Expecting asyncIterator to filter by arguments automatically
  • Believing subscriptions cannot filter events
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard