Skip to content

Instantly share code, notes, and snippets.

@jameswragg
Last active September 6, 2023 09:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jameswragg/23b589b6b5eb4082ebb78a782c45a07b to your computer and use it in GitHub Desktop.
Save jameswragg/23b589b6b5eb4082ebb78a782c45a07b to your computer and use it in GitHub Desktop.
Promise.allSettled with Object keys
/**
* Resolves all Promises from a key/val object, returning the same structure but resolved
* @param {Object.<string, (function)>} obj - An object with any number of key-value pairs.
* @returns {{ values: object, rejected: object }}
*/
const labelledPromises = async (obj) => {
const keys = Object.keys(obj);
const promises = Object.values(obj);
const results = await Promise.allSettled(promises);
const all = keys.reduce((acc, key, i) => {
acc[key] = results[i];
return acc;
}, {});
const rejected = Object.keys(all)
.filter((key) => all[key].status === 'rejected')
.reduce((acc, key) => {
acc[key] = all[key].reason;
return acc;
}, {});
const values = Object.keys(all).reduce((acc, key) => {
acc[key] = all[key].value ?? undefined;
return acc;
}, {});
return {
values,
rejected,
};
};
module.exports = labelledPromises;
@jameswragg
Copy link
Author

jameswragg commented Sep 5, 2023

Given an object of labelled promises, get them back resolved with default support:

  const { values, rejected } = await labelledPromises({
    key1num: Promise.resolve(123),
    key2fail: Promise.reject(new Error("bang")),
    key3obj: Promise.resolve({}),
    key4str: Promise.resolve("hello"),
    key5nul: null,
    key6fal: false,
  });

Will result in:

  // {
  //     values: { key1num: 123, key2fail: undefined, key3obj: {}, key4str: 'hello', key5nul: undefined, key6fal: false },
  //     rejected: { key2fail: [Error: bang] }
  // }

NOTE: you can use object destructuring to assign defaults, e.g.

const { key1num = 1, key2fail = 2, key3obj = 3, key4str = 4, key5nul = 5, key6fal = 6 } = values;

console.log({ key1num, key2fail, key3obj, key4str, key5nul, key6fal });
// -> { key1num: 123, key2fail: 2, key3obj: {}, key4str: 'hello', key5nul: 5, key6fal: false }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment