In the previous post, we explored short polling. This time, let’s upgrade to long polling, a technique that keeps the client in sync with the server without frequent re-requests.
🧠 What’s Different?
In long polling:
- Client sends a request and waits.
- Server responds only when there is new data.
- Once response is received, the client immediately resubscribes.
Let’s understand this using the core code blocks involved.
🧩 Server Code Highlights
1. Store connections for later use
const connections = []; app.get('/subscribe', (req, res) => { if (req.query.data !== longPollingData) { return res.status(200).json({ message: longPollingData }); } connections.push(res); // hold the response until new data is available });
If the client already has the latest data, we hold the response (res) for future updates.
Otherwise, respond immediately.
2. Notify all clients on data update
app.post('/updateData', (req, res) => { longPollingData = req.body.userInput; connections.forEach((connection) => { connection.status(200).json({ message: longPollingData }); }); connections.length = 0; res.send('Update sent to all clients'); });
On receiving new data, we loop through all held responses and send the updated message.
Then, we clear the connections array.
Client Code Highlights
1. Subscribe and re-subscribe
const subscribe = async (lastData) => { try { const res = await fetch('/subscribe?data=' + lastData); const data = await res.json(); updateData(data.message); await subscribe(data.message); // recursive re-subscribe } catch (err) { await new Promise((res) => setTimeout(res, 1000)); await subscribe(lastData); // retry on failure } };
- Makes a /subscribe request and waits for server update.
- Once update is received, it recursively re-subscribes.
2. Submit new data
form.addEventListener('submit', async (e) => { e.preventDefault(); const inputValue = document.getElementById('userInput').value; await fetch('/updateData', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userInput: inputValue }), }); form.reset(); updateData(inputValue); });
Sends new input to server which triggers an update to all subscribed clients.
✅ Summary
Long polling holds client requests until new data is ready.
It’s efficient and feels real-time without setting up a WebSocket.
✅ Conclusion
Long polling offers a smarter alternative to short polling by reducing unnecessary traffic and keeping clients updated with minimal latency. While not as seamless as WebSockets, it's a practical solution for many use cases where persistent connections aren’t viable.
👍 Pros
- ✅ Reduced network traffic compared to short polling.
- ✅ Near real-time data delivery without constant re-requesting.
- ✅ Works with HTTP/1.1, no need for WebSocket support.
- ✅ Simple implementation using standard HTTP methods.
👎 Cons
- ❌ Each update still requires a new HTTP connection.
- ❌ More resource-intensive than WebSockets at scale.
- ❌ Delayed response if no data is available for a while.
- ❌ Not truly bi-directional — only server-to-client.
🕒 When to Use Long Polling
- You need real-time-like updates, but WebSockets are not an option (e.g., firewalls, older infrastructure).
- Your app doesn’t need constant updates but should reflect new data quickly.
- You want a simpler alternative to WebSockets that works in most browsers.
Top comments (0)