52 lines
1.3 KiB
Markdown
52 lines
1.3 KiB
Markdown
|
|
---
|
|||
|
|
title: Dependency-Based Parallelization
|
|||
|
|
impact: CRITICAL
|
|||
|
|
impactDescription: 2-10× improvement
|
|||
|
|
tags: async, parallelization, dependencies, better-all
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Dependency-Based Parallelization
|
|||
|
|
|
|||
|
|
For operations with partial dependencies, use `better-all` to maximize parallelism. It automatically starts each task at the earliest possible moment.
|
|||
|
|
|
|||
|
|
**Incorrect (profile waits for config unnecessarily):**
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
const [user, config] = await Promise.all([
|
|||
|
|
fetchUser(),
|
|||
|
|
fetchConfig()
|
|||
|
|
])
|
|||
|
|
const profile = await fetchProfile(user.id)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Correct (config and profile run in parallel):**
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import { all } from 'better-all'
|
|||
|
|
|
|||
|
|
const { user, config, profile } = await all({
|
|||
|
|
async user() { return fetchUser() },
|
|||
|
|
async config() { return fetchConfig() },
|
|||
|
|
async profile() {
|
|||
|
|
return fetchProfile((await this.$.user).id)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Alternative without extra dependencies:**
|
|||
|
|
|
|||
|
|
We can also create all the promises first, and do `Promise.all()` at the end.
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
const userPromise = fetchUser()
|
|||
|
|
const profilePromise = userPromise.then(user => fetchProfile(user.id))
|
|||
|
|
|
|||
|
|
const [user, config, profile] = await Promise.all([
|
|||
|
|
userPromise,
|
|||
|
|
fetchConfig(),
|
|||
|
|
profilePromise
|
|||
|
|
])
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Reference: [https://github.com/shuding/better-all](https://github.com/shuding/better-all)
|