NextJS 可以在 route handler 中使用 setTimeOut 吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cyron
V2EX    Next.js

NextJS 可以在 route handler 中使用 setTimeOut 吗

  •  
  •   Cyron 2024-04-26 11:05:30 +08:00 1703 次点击
    这是一个创建于 531 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在用 NextJS 写 API 时想要实现一个场景:用户操作成功后,服务器在 2s 后执行一个逻辑。

    下面用 kv 做个示例:

    import { kv } from "@vercel/kv"; export async function GET() { let page1 = await kv.get("page:1"); setTimeout(() => { kv.incr("page-visit:1"); }, 2000); return Response.json({ data: page1 }); } export const runtime = "edge"; // 尝试过 nodejs 效果一样 export const fetchCache = "force-no-store"; 

    其中 incr 在本地可以正常执行,但在 Vercel 上部署时会发生:

    • timeout=10ms 时,可以正常执行 incr
    • timeout=2000ms 时,本次 API 调用不会执行 incr ,但会在下次调用时执行上一次的 incr

    我的猜测是:本地 node 是守护进程,所以计时器不会被卸载掉,incr 正常执行;而 Vercel 上是 Serverless Function ,10ms 内 CPU 分配还在就会执行 incr ,2000ms 时 CPU 已经不分配了就不会执行 incr

    我只是想薅 Vercel 的羊毛,请教大家如何才能做到延迟调用

    4 条回复    2024-05-04 19:07:41 +08:00
    moooooooo
        1
    moooooooo  
       2024-04-26 17:31:18 +08:00
    你这个 setTimeout 是异步的。用 Promise 包一层变成同步使得 get 里的代码依次执行就行了
    Cyron
        2
    Cyron  
    OP
       2024-04-28 20:21:49 +08:00
    @moooooooo #1 我就是想异步,让 response 先返回
    rocmax
        3
    rocmax  
       2024-05-02 00:32:23 +08:00
    默认 Timeout:
    edge: 25s
    node: Hobby plan 10s
    https://vercel.com/docs/functions/runtimes#max-duration

    2s 不至于触发 timeout ,setTimeout 把回调函数入栈后应该是会被执行的。你观察到的现象是不是第一次后台执行完了第二次访问才看到更新后的状态?因为按道理第二次执行会添加一个新的计时器。

    你的需求可以考虑用 streaming 实现,先创建 stream 发你想发的 response ,等 2s 后处理完成后再发送更新后的结果&关闭 stream 。
    Cyron
        4
    Cyron  
    OP
       2024-05-04 19:07:41 +08:00 via iPhone
    @rocmax 我写过 streaming api ,这个和 timeout 确实没关系,我给的代码片段你可以试一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1147 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:27 PVG 07:27 LAX 16:27 JFK 19:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86