Skip to content

AsyncHelpers

import: @azure-net/kit

AsyncHelpers возвращает объект из джвух методов

  • createAsyncAction - предполагает методы POST, PUT, DELETE, PATCH
  • createAsyncResource - предполагает метод 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
	}
);