如何在 Next.js 中中止服务器操作?

问题描述 投票:0回答:1

https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions

文档中没有提及如何中止操作以及如何处理中止。

next.js
1个回答
0
投票

我使用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';
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.