https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions
文档中没有提及如何中止操作以及如何处理中止。
我使用next 14.1.4测试了以下内容,但它可能适用于以前的版本。就我而言,我设法通过终止操作的调用来中止该操作。
例如,
const delayWithAbort = async (ms: number, abortSignal: AbortSignal) => {
return new Promise((resolve, reject) => {
const timer = setTimeout(resolve, ms);
if (abortSignal) {
abortSignal.addEventListener('abort', () => {
clearTimeout(timer);
console.log('delayWithAbort was aborted');
reject( new AbortError('Delay aborted'));
})
}
});
};
我的路线
export async function GET(req: Request) {
try {
req.signal.onabort = () => {
console.log('Browser/Proxy abruptly disconnected'); // just fyi
};
await delayWithAbort(4000, req.signal);
} catch (e) {
if (e instanceof AbortError) {
return new Response('aborted', { status: 499 })
}
return new Response('error', {status: 500});
}
// happy path
return Response.json({
hello: "world",
date: new Date().toLocaleString("en-US", {
timeZone: "America/New_York",
}),
});
}
class AbortError extends Error {
constructor(message: string) {
super(message);
this.name = 'AbortError';
}
}