- Working on cancelable api

This commit is contained in:
Ferdi Koomen 2021-03-13 00:01:58 +01:00
parent 1dcbfdad77
commit f9a73a0a21
8 changed files with 73 additions and 68 deletions

View File

@ -1,6 +1,12 @@
export class CancelablePromise<T> extends Promise<T> {
constructor(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) {
private readonly _cancel: (reason?: any) => void;
constructor(executor: (
resolve: (value: T | PromiseLike<T>) => void,
reject: () => void
cancel: () => void
) => void) {
super(executor);
}

View File

@ -3,7 +3,7 @@
import { ApiError } from './ApiError';
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
import type { CancelablePromise } from './CancelablePromise';
import { CancelablePromise } from './CancelablePromise';
import { OpenAPI } from './OpenAPI';
{{>functions/isDefined}}
@ -51,24 +51,25 @@ import { OpenAPI } from './OpenAPI';
/**
* Request using fetch client
* @param options The request options from the the service
* @returns ApiResult
* @returns CancelablePromise<T>
* @throws ApiError
*/
export async function request(options: ApiRequestOptions): CancelablePromise<ApiResult> {
const controller = new AbortController();
const url = getUrl(options);
const response = await sendRequest(options, url, controller.signal);
const responseBody = await getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
export function request<T>(options: ApiRequestOptions): CancelablePromise<T> {
return new CancelablePromise((resolve, reject, cancel) => {
const controller = new AbortController();
const url = getUrl(options);
const response = await sendRequest(options, url, controller.signal);
const responseBody = await getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
const result: ApiResult = {
url,
ok: response.ok,
status: response.status,
statusText: response.statusText,
body: responseHeader || responseBody,
};
const result: ApiResult = {
url,
ok: response.ok,
status: response.status,
statusText: response.statusText,
body: responseHeader || responseBody,
};
catchErrors(options, result);
return result;
catchErrors(options, result);
});
}

View File

@ -8,7 +8,7 @@ import { types } from 'util';
import { ApiError } from './ApiError';
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
import type { CancelablePromise } from './CancelablePromise';
import { CancelablePromise } from './CancelablePromise';
import { OpenAPI } from './OpenAPI';
{{>functions/isDefined}}
@ -56,24 +56,25 @@ import { OpenAPI } from './OpenAPI';
/**
* Request using node-fetch client
* @param options The request options from the the service
* @returns ApiResult
* @returns CancelablePromise<T>
* @throws ApiError
*/
export async function request(options: ApiRequestOptions): CancelablePromise<ApiResult> {
const controller = new AbortController();
const url = getUrl(options);
const response = await sendRequest(options, url, controller.signal);
const responseBody = await getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
export function request<T>(options: ApiRequestOptions): CancelablePromise<T> {
return new CancelablePromise((resolve, reject, cancel) => {
const controller = new AbortController();
const url = getUrl(options);
const response = await sendRequest(options, url, controller.signal);
const responseBody = await getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
const result: ApiResult = {
url,
ok: response.ok,
status: response.status,
statusText: response.statusText,
body: responseHeader || responseBody,
};
const result: ApiResult = {
url,
ok: response.ok,
status: response.status,
statusText: response.statusText,
body: responseHeader || responseBody,
};
catchErrors(options, result);
return result;
catchErrors(options, result);
});
}

View File

@ -3,7 +3,7 @@
import { ApiError } from './ApiError';
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
import type { CancelablePromise } from './CancelablePromise';
import { CancelablePromise } from './CancelablePromise';
import { OpenAPI } from './OpenAPI';
{{>functions/isDefined}}
@ -54,23 +54,24 @@ import { OpenAPI } from './OpenAPI';
/**
* Request using XHR client
* @param options The request options from the the service
* @returns ApiResult
* @returns CancelablePromise<T>
* @throws ApiError
*/
export async function request(options: ApiRequestOptions): CancelablePromise<ApiResult> {
const url = getUrl(options);
const response = await sendRequest(options, url);
const responseBody = getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
export function request<T>(options: ApiRequestOptions): CancelablePromise<T> {
return new CancelablePromise((resolve, reject, cancel) => {
const url = getUrl(options);
const response = await sendRequest(options, url);
const responseBody = getResponseBody(response);
const responseHeader = getResponseHeader(response, options.responseHeader);
const result: ApiResult = {
url,
ok: isSuccess(response.status),
status: response.status,
statusText: response.statusText,
body: responseHeader || responseBody,
};
const result: ApiResult = {
url,
ok: isSuccess(response.status),
status: response.status,
statusText: response.statusText,
body: responseHeader || responseBody,
};
catchErrors(options, result);
return result;
catchErrors(options, result);
});
}

View File

@ -16,5 +16,7 @@ async function sendRequest(options: ApiRequestOptions, url: string): Promise<XML
}
};
xhr.send(getRequestBody(options));
// xhr.abort();
});
}

View File

@ -36,8 +36,8 @@ export class {{{name}}} {
{{/each}}
* @throws ApiError
*/
public static async {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
const result = await __request({
public static {{{name}}}({{>parameters}}): CancelablePromise<{{>result}}> {
return __request({
method: '{{{method}}}',
path: `{{{path}}}`,
{{#if parametersCookie}}
@ -82,7 +82,6 @@ export class {{{name}}} {
},
{{/if}}
});
return result.body;
}
{{/each}}

View File

@ -4,6 +4,7 @@ import { HttpClient } from '../HttpClient';
import templateCoreApiError from '../templates/core/ApiError.hbs';
import templateCoreApiRequestOptions from '../templates/core/ApiRequestOptions.hbs';
import templateCoreApiResult from '../templates/core/ApiResult.hbs';
import templateCancelablePromise from '../templates/core/CancelablePromise.hbs';
import fetchGetHeaders from '../templates/core/fetch/getHeaders.hbs';
import fetchGetRequestBody from '../templates/core/fetch/getRequestBody.hbs';
import fetchGetResponseBody from '../templates/core/fetch/getResponseBody.hbs';
@ -28,7 +29,6 @@ import nodeGetResponseHeader from '../templates/core/node/getResponseHeader.hbs'
import nodeRequest from '../templates/core/node/request.hbs';
import nodeSendRequest from '../templates/core/node/sendRequest.hbs';
import templateCoreSettings from '../templates/core/OpenAPI.hbs';
import templateCancelablePromise from '../templates/core/CancelablePromise.hbs';
import templateCoreRequest from '../templates/core/request.hbs';
import xhrGetHeaders from '../templates/core/xhr/getHeaders.hbs';
import xhrGetRequestBody from '../templates/core/xhr/getRequestBody.hbs';

View File

@ -2,22 +2,17 @@
/* tslint:disable */
/* eslint-disable */
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
import { CancelablePromise } from './CancelablePromise';
import { OpenAPI } from './OpenAPI';
export async function request(options: ApiRequestOptions): Promise<ApiResult> {
export function request<T>(options: ApiRequestOptions): CancelablePromise<T> {
return new CancelablePromise((resolve, reject, cancel) => {
const url = `${OpenAPI.BASE}${options.path}`;
const url = `${OpenAPI.BASE}${options.path}`;
// Do your request...
// Do your request...
return {
url,
ok: true,
status: 200,
statusText: 'dummy',
body: {
resolve({
...options
},
};
});
});
}