Преобразовать карту обещаний и вернуть обещание карты урегулированных обещанийJavascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Преобразовать карту обещаний и вернуть обещание карты урегулированных обещаний

Сообщение Anonymous »

У меня есть карта обещаний, например ,::

Код: Выделить всё

const namedPromises = {
database: promise1 as Promise,
someApi: promise2 as Promise,
// ...
} as Record;
Пример использования для этого - отчетность о здравоохранении для службы (подумайте, что вызов A/Health конечная точка, и она вызывает другие конечные точки/зависимости для их здоровья). Я хочу преобразовать его в обещание , которое возвращает карту урегулированных обещаний, как SO:

Код: Выделить всё

function async someMethod(namedPromises: Record): Promise {
// ...magic...

// i know the result will be more generic but this is for example's sake.
return {
database: promiseSettled1 as PromiseSettledResult,
someApi: promiseSettled2 as PromiseSettledResult,
};
}
Я знаю о функции обещания. Все, что , которая требует массива обещания s и возвращает массив урегулированных, однако для того, чтобы обернуть каждый по имени Ввод именованной промежуткой записи в обещание, я должен позвонить .Then и составить на карту результат следующим образом:

Код: Выделить всё

const wrapped = Object.entries(namedPromises).map(([key, promise]) => {
return promise.then(
(value) => ({
key,
result: {
status: 'fulfilled',
value,
} as PromiseFulfilledResult,
}),
(reason) => ({
key,
result: {
status: 'rejected',
reason,
},
}),
);
});
< /code>
Я предоставляю ключ как разрешенные, так и отклоненные результаты, чтобы узнать, какое обещание это относится. < /p>
Вот основная проблема. Этот мета -результат также является обещанием 
, подразумевая, что он также может отклонить, даже если он явно не (кроме тайм -аутов, с которыми мы можем справиться с обещанием. Полный пример ниже). Система типа не знает лучше. Отклоненные обещания не знают, с каким ключом они относятся, поскольку информация о ключе скрыта в рамках успешно разрешенного обещания. - Инструментальное логистическое ограничение вокруг названных обещаний, которые могут потерпеть неудачу, - но я не могу оправдать это чувство с доказательством. уровень () Список установленных программ только по выполнению результатов, затем верните внутреннюю карту. Ниже приведен пример моего кода с этим обходным процессом, предоставляет ли TypeScript более элегантные средства выполнения этой задачи? br /> async allSettledDependencies(
dependencyHealthReporters: Record,
timeoutPerDependency: number = 1000, // ms
): Promise {
const withTimeout = (
key: string,
promise: Promise,
): Promise => {
const timeoutPromise = new Promise((_, reject) =>
setTimeout(
() =>
reject(new Error(`Timeout exceeded: ${timeoutPerDependency}ms`)),
timeoutPerDependency,
),
);

// allow dependencies to timeout individually to increase resilience of health function.
return Promise.race([promise, timeoutPromise]).then(
(value) => ({
key,
result: {
status: 'fulfilled',
value,
} as PromiseFulfilledResult,
}),
// this will be either the timeout rejection, or the rejected promise.
(reason) => ({
key,
result: {
status: 'rejected',
reason,
},
}),
) as Promise;
};

const settledEntries = await Promise.allSettled(
Object.entries(dependencyHealthReporters).map(
([dependencyName, promise]) => withTimeout(dependencyName, promise),
),
);

return Object.fromEntries(
settledEntries
// we rely on all promises being fulfilled at the `withTimeout` function for this logic to work.
.filter((topSettled) => topSettled.status === 'fulfilled')
.map(({ value }) => [
value.key,
// either returns the resolved health info or converts the rejection error into an
this.healthInfoFromSettledResult(value.result),
]),
);
}
< /code>
Некоторые связанные мысли: < /p>
  • Есть ли способ сказать: «Поверьте мне, все это решает?» кроме того, что неизвестно, так как обещание > Если я уверен в гарантированном урегулировании обернутых обещаний, что -то кажется вонючим по этому поводу.


Подробнее здесь: https://stackoverflow.com/questions/794 ... d-promises
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как создать карту с горизонтальным смахиванием, удаление карты с помощью правой карты и добавление индекса карты с помощ
    Anonymous » » в форуме IOS
    0 Ответы
    127 Просмотры
    Последнее сообщение Anonymous
  • Как вернуть обещание, ожидающее, пока isLoaded станет правдой
    Гость » » в форуме Javascript
    0 Ответы
    72 Просмотры
    Последнее сообщение Гость
  • Как преобразовать карту Java в неизменяемую карту Scala с помощью кода Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Понимание цепочки обещаний в PHP
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Цикл событий в Node JS для обещаний
    Anonymous » » в форуме Javascript
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Javascript»