request-pre
Version:
process format data before request send
26 lines (25 loc) • 992 B
text/typescript
import { requestReturn, middleware } from './request';
import { ApiSchema } from '../api';
export type composeEnd = (ctx: ApiSchema) => requestReturn;
export type middlewareEnd = (ctx: ApiSchema, next: composeEnd) => requestReturn;
export default function(middlewareList: middleware[]): middlewareEnd {
return function (ctx: ApiSchema, next: composeEnd): requestReturn {
let index = -1;
const dispatch = function(i: number): requestReturn {
if (i <= index) {
return Promise.reject(new Error('next() called multiple times'));
}
index = i;
let fn = middlewareList[i];
if (i === middlewareList.length) {
fn = next;
}
if (!fn) {
return Promise.resolve(ctx);
} else {
return Promise.resolve(fn(ctx, fn === next ? undefined : dispatch.bind(null, i + 1)));
}
};
return dispatch(0);
};
}