|
|
||
|---|---|---|
| .. | ||
| dist | ||
| src | ||
| LICENSE | ||
| README.md | ||
| package.json | ||
README.md
Combine-Promises
Like Promise.all(array) but with an object.
import combinePromises from 'combine-promises';
const { user, company } = await combinePromises({
user: fetchUser(),
company: fetchCompany(),
});
Why:
- Insensitive to destructuring order typos
- Simpler async functional code
Features:
- TypeScript support
- Lightweight
- Feature complete
- Well-tested
- ESM / CJS
TypeScript support
Good, native and strict TypeScript support:
- Return type correctly inferred from the input object
- All object values should be async
- Only accept objects (reject arrays, null, undefined...)
const result: { user: User; company: Company } = await combinePromises({
user: fetchUser(),
company: fetchCompany(),
});
Insensitive to destructuring order
A common error with Promise.all is to have a typo in the destructuring order.
// Bad: destructuring order reversed
const [company, user] = await Promise.all([fetchUser(), fetchCompany()]);
This code becomes particularly dangerous as size of the array promise grows over time.
With combinePromises, you are using explicit names instead of array indices, which makes the code more robust and not sensitive to destructuring order:
// Good: we don't care about the order anymore
const { company, user } = await combinePromises({
user: fetchUser(),
company: fetchCompany(),
});
Simpler async functional code
Suppose you have an object representing a friendship like {user1: "userId-1", user2: "userId-2"}, and you want to transform it to {user1: User, user2: User}.
You can easily do that:
import combinePromises from 'combine-promises';
import { mapValues } from 'lodash';
const friendsIds = { user1: 'userId-1', user2: 'userId-2' };
const friends = await combinePromises(mapValues(friendsIds, fetchUserById));
Without this library: good luck to keep your code simple.
Inspirations
Name inspired by combineReducers from Redux.