packages-fetcher/fetcher/stories/demo-features/index.tsx (120 lines of code) (raw):
import React, {
useState,
useCallback
} from 'react';
import ThemeSwitcher from '@alicloud/console-base-demo-helper-theme-switcher';
import {
H1,
P,
List,
Button,
PrePromise
} from '@alicloud/demo-rc-elements';
import {
createFetcherErrorSkipNetwork
} from '../../src';
import PkgInfo from '../pkg-info';
import {
fetcher1
} from '../fetcher';
const {
get,
post,
jsonp
} = fetcher1;
const paramsInOptions = {
p1: 'param1111 - will not override p1 in params',
added: 'yes - will be added'
};
const params = {
p1: 'param1',
p2: 2,
pArr: ['p.arr.1', 'p.arr.2', 'p.arr.3']
};
function testNormal(): Promise<unknown> {
return get({
params: paramsInOptions
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success', params);
}
function testPriority(): Promise<unknown> {
return get({
params: paramsInOptions,
additionalInterceptorsForRequest: [
[function() {
// eslint-disable-next-line no-console
console.info(111);
}],
[2, function() {
// eslint-disable-next-line no-console
console.info(222); // 在开始执行
}]
]
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success', params);
}
function testSkipNetwork(): Promise<unknown> {
return get({
params: paramsInOptions,
additionalInterceptorsForRequest: [
[function() {
throw createFetcherErrorSkipNetwork<boolean>(new Promise<boolean>(resolve => window.setTimeout(() => resolve(true), 500)));
}]
]
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success', params);
}
function testPostJson(): Promise<unknown> {
return post({
headers: {
'Content-Type': 'application/json'
},
params: paramsInOptions
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success', params);
}
function getAbortSignal(): AbortSignal | null {
if (!window.AbortController) { // IE 不行
return null;
}
const abortController = new AbortController();
setTimeout(() => abortController.abort(), 36);
return abortController.signal;
}
function testAbortGet(): Promise<unknown> {
return get({
signal: getAbortSignal()
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success', params);
}
function testAbortPost(): Promise<unknown> {
return post({
signal: getAbortSignal()
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success');
}
function testAbortJsonp(): Promise<unknown> {
return jsonp({
signal: getAbortSignal()
}, 'https://oneapi.alibaba-inc.com/mock/boshit/success');
}
export default function DemoFeatures(): JSX.Element {
const [statePromise, setStatePromise] = useState<Promise<unknown> | null>(null);
const handleTestNormal = useCallback(() => setStatePromise(testNormal()), [setStatePromise]);
const handleTestPriority = useCallback(() => setStatePromise(testPriority()), [setStatePromise]);
const handleTestSkipNetwork = useCallback(() => setStatePromise(testSkipNetwork()), [setStatePromise]);
const handleTestPostJson = useCallback(() => setStatePromise(testPostJson()), [setStatePromise]);
const handleTestAbortGet = useCallback(() => setStatePromise(testAbortGet()), [setStatePromise]);
const handleTestAbortPost = useCallback(() => setStatePromise(testAbortPost()), [setStatePromise]);
const handleTestAbortJsonp = useCallback(() => setStatePromise(testAbortJsonp()), [setStatePromise]);
return <>
<ThemeSwitcher />
<PkgInfo />
<H1>临时拦截器</H1>
<P>可以通过 <code>additionalInterceptorsForRequest</code> 添加临时的拦截器,它只影响当前的请求。</P>
<List ordered>
<span>默认的临时拦截器会在 <em>预设</em> 拦截器(如果没有指定优先级)之后执行,优先级的默认值为 10</span>
<span>通过指定优先级,如 <code>[1, interceptor]</code> 可以让它在预设拦截器之前执行</span>
<span>通过在请求拦截器中使用 <code>createFetcherErrorSkipNetwork(promise, fetcherConfig)</code> 可以直接返回结果,不经过网络请求和响应拦截器</span>
</List>
<Button onClick={handleTestNormal}>testNormal</Button>
<Button onClick={handleTestPriority}>testPriority</Button>
<Button onClick={handleTestSkipNetwork}>testSkipNetwork</Button>
<Button onClick={handleTestPostJson}>testPostJson</Button>
<Button onClick={handleTestAbortGet}>testAbortGet</Button>
<Button onClick={handleTestAbortPost}>testAbortPost</Button>
<Button onClick={handleTestAbortJsonp}>testAbortJsonp</Button>
<PrePromise promise={statePromise} />
</>;
}