AsyncHelpers
import: @azure-net/kit
AsyncHelpers возвращает объект из джвух методов
createAsyncAction- предполагает методы POST, PUT, DELETE, PATCHcreateAsyncResource- предполагает метод GET
Они возвращают ответ по разному и имеют немалый набор настроек.
Сначала посмотрим на прямую реализацию, а после на детальный настройки.
typescript
import { createAsyncHelpers } from '@azure-net/kit';
// Считаю важным напомнить что принимает данный метод объект с ключом parseError
// В данный ключ можно передать errorParser из предыдущего блока, там же есть пример
const { createAsyncAction, createAsyncResource } = createAsyncHelpers();
// error формата AppError, success - успешность выполнения метода, response соответственно ответ.
// createAsyncAction принимает callback и ожидает что он возвращает Promise
const { success, response, error } = await createAsyncAction(() => SomePromiseFunc());
// Возвращает ответ напрямую, также принимает callback и ожидает что он возвращает Promise
const resource = await createAsyncResource(() => SomePromiseFunc());Вторым аргументом после callback и createAsyncResource и createAsyncAction принимают объект с настройками
typescript
const createAsyncAction = <Res = unknown, Req = unknown>(
action: ActionOrThunk<Res>,
args?: {
// Происходит прямо перед вызовом action или resource, выполнение останавливается и не продолжится до вызова next
beforeSend?: (next: () => void, abort: () => void) => void | Promise<void>;
// Произойдет при успешном выполнении запроса, предоставляет доступ к ответу в коолбэке
// То что вы возвращаете игнорируется, return просто прерывает исполнение.
onSuccess?: (result: AsyncActionResponse<Res, undefined, Custom>) => Promise<unknown> | unknown;
// Произойдет если запрос прошел неуспешно. Также игнорирует ваш возврат, дает доступ к error
onError?: (result: AsyncActionResponse<never, Req, Custom>) => Promise<unknown> | unknown;
// Отвечает за то вернется ли fallback ответа или все таки произойдет throw Error (если true)
reject?: boolean;
// condition - по какому условию проихойдет abort запроса, onAbort - что произойдет после abort
abort?: {
condition: boolean;
onAbort?: () => void;
};
// Fallback ответа, если запрос упал вернет его как ответ, если reject === false
fallbackResponse?: Res;
}
): Promise<AsyncActionResponse<Res, Req, Custom>> => {}Настройки одинаковы как для createAsyncResource так и для createAsyncAction. Важным моментом является то что AsyncHelpers работают со схемами из пакета и при ошибке валидации они обработают и отдадут ошибки (о схемах в блоке ниже).
Пример
typescript
// Метод json автоматически заставит схему провалидироваться до запроса, если валидация упадет, то в ключ error.fields вы получите ошибки схемы
const create = async (request: Partial<IScriptCreateRequest>) =>
await createAsyncAction<IScript, IScriptCreateRequest>(ScriptService.create(CreateScriptSchema.from(request).json()), {
onSuccess: () => {
successNotification('shared.notifications.created');
}
});Расширенный пример
typescript
const complexAction = await createAsyncAction(
async () => {
const step1 = await firstApiCall();
const step2 = await secondApiCall(step1.id);
return step2;
},
{
abort: {
condition: shouldAbort,
onAbort: () => console.log('Операция отменена')
},
beforeSend: async (next, abort) => {
const canProceed = await checkPermissions();
if (canProceed) {
next();
} else {
abort();
}
},
reject: true, // Выбрасываем исключения вместо возврата ошибки в ключе error
fallbackResponse: defaultValue
}
);