Skip to content
⚠️ This article was written in 2020. Some content may be outdated.

Promise.allSettled for Parallel Request Handling

Using Promise.allSettled for parallel request handling is seeing wider use in frontend development. Drawing on real projects, this article digs into its core principles and best practices.

Basic Usage ​

Here are a few ways we can improve on this:

javascript
.container {
  width: min(90%, 1200px);
  margin-inline: auto;
  padding-inline: clamp(1rem, 3vw, 3rem);
}

.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
  gap: clamp(1rem, 2vw, 2rem);
}

.card { container-type: inline-size; }

@container (min-width: 400px) {
  .card__content { display: grid; grid-template-columns: 200px 1fr; }
}

This approach has been running stably in production for over half a year, so it is battle-tested.

Advanced Usage ​

Let's start with the basic implementation:

javascript
const fs = require('fs')
const { Transform, pipeline } = require('stream')
const { promisify } = require('util')
const pipelineAsync = promisify(pipeline)

const csvToJson = new Transform({
  transform(chunk, encoding, callback) {
    const lines = chunk.toString().split('\n')
    const headers = lines[0].split(',')
    for (let i = 1; i < lines.length; i++) {
      if (!lines[i].trim()) continue
      const values = lines[i].split(',')
      const obj = {}
      headers.forEach((h, idx) => obj[h.trim()] = values[idx]?.trim())
      this.push(JSON.stringify(obj) + '\n')
    }
    callback()
  }
})

This snippet shows the basic usage. In a real project you also need to handle errors and edge cases.

Practical Cases ​

Building on that, we can push the optimization a step further:

javascript
import { useRef, useEffect, useState } from 'react'

function useIntersectionObserver(options = {}) {
  const [isVisible, setIsVisible] = useState(false)
  const ref = useRef(null)

  useEffect(() => {
    const observer = new IntersectionObserver(([entry]) => {
      setIsVisible(entry.isIntersecting)
    }, { threshold: 0.1, ...options })
    const el = ref.current
    if (el) observer.observe(el)
    return () => { if (el) observer.unobserve(el) }
  }, [])

  return [ref, isVisible]
}

This pattern is very practical in larger projects and significantly lowers maintenance cost.

Performance Optimization ​

In real projects the usage gets a bit more involved:

javascript
.container {
  width: min(90%, 1200px);
  margin-inline: auto;
  padding-inline: clamp(1rem, 3vw, 3rem);
}

.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr));
  gap: clamp(1rem, 2vw, 2rem);
}

.card { container-type: inline-size; }

@container (min-width: 400px) {
  .card__content { display: grid; grid-template-columns: 200px 1fr; }
}

This approach improves both the testability and extensibility of the code.

Common Traps ​

Here is a complete example:

javascript
const fs = require('fs')
const { Transform, pipeline } = require('stream')
const { promisify } = require('util')
const pipelineAsync = promisify(pipeline)

const csvToJson = new Transform({
  transform(chunk, encoding, callback) {
    const lines = chunk.toString().split('\n')
    const headers = lines[0].split(',')
    for (let i = 1; i < lines.length; i++) {
      if (!lines[i].trim()) continue
      const values = lines[i].split(',')
      const obj = {}
      headers.forEach((h, idx) => obj[h.trim()] = values[idx]?.trim())
      this.push(JSON.stringify(obj) + '\n')
    }
    callback()
  }
})

Pay close attention to edge-case handling — that is critical in production.

Summary ​

  • Keep an eye on the community — technical solutions need to keep evolving.
  • Don't adopt new tech just for its own sake.
  • The code samples are for reference only; adapt them to your use case.
  • Promise.allSettled for parallel request handling isn't a silver bullet — pick it based on project size and your tech stack.
  • Understanding the fundamentals matters more than memorizing APIs.

MIT Licensed