Я все еще учусь и играю с fp-ts
и не могу понять это. У меня есть несколько вызовов API, и я хочу собрать все успешные ответы и все ошибки в массивы.
Итак, я попытался использовать array.sequence
:
TE.map(schedules =>
array.sequence(TE.taskEither)(
schedules.map(({ Program, ...schedule }) =>
pipe(
createProgramIfNotExist(Program),
TE.map(createdProgram =>
setRecordingSchedules(programsClient, { ...schedule, ProgramId: createdProgram.Id }),
),
TE.flatten,
),
),
),
),
TE.flatten
, который прекрасно работает для ответы, но я получаю только последнюю ошибку от вызовов API. Есть ли способ собрать все ошибки в один массив?
Ниже я написал функции, которые делают вызовы API, на случай, если у меня возникнет проблема.
export const setRecordingSchedules = (
fetcher: AxiosInstance,
config: RecordingConfig,
): TE.TaskEither<Error, [ReturnType<typeof Schedule.codec.encode>, number]> => {
const url = `/programs/${config.ProgramId}/recordingschedules`;
return pipe(Schedule.codec.encode({ ...config, AutoPodcastConfig }), body =>
pipe(
TE.tryCatch(
() => handleRateLimit(() => fetcher.put(url, body)),
err => raiseUpdateError(unknownToError(err)),
),
TE.map(({ status }) => [body, status]),
),
);
};
export const createRecordingSchedule = (
fetcher: AxiosInstance,
program: Program.Type,
): TE.TaskEither<Error, Program.Type> =>
pipe(
Program.codec.encode(program),
body =>
pipe(
TE.tryCatch(
() => handleRateLimit(() => fetcher.post('/programs', body)),
err => raiseCreateError(unknownToError(err)),
),
TE.map(({ data }) =>
pipe(
Program.codec.decode({ ...data, Network: program.Network }),
E.bimap(
errors => ReportValidationError(errors, { ...data, Network: program.Network }),
decoded => decoded,
),
TE.fromEither,
),
),
),
TE.flatten,
);