提问人:acupoftea 提问时间:11/15/2023 最后编辑:acupoftea 更新时间:11/23/2023 访问量:130
为什么服务器操作不能并发执行?
Why are Server Actions not executing concurrently?
问:
请考虑以下功能:
async function printAB() {
console.log("A");
await new Promise((resolve) => setTimeout(resolve, 1000));
console.log("B");
}
async function f() {
printAB();
printAB();
}
通常的预期输出将是f()
A
A
B
B
因为这些语句可以与超时同时执行。事实上,如果函数既在服务器上(操作或在服务器组件中定义),要么同时在客户端上,我们就会得到这样的结果。但是,如果是服务器操作,并且是用户组件中的函数,则我们得到console.log('A')
printAB
f
A
B
A
B
.为什么会这样?如果我们一次使用多个操作,这种行为可能会导致性能下降,有没有办法避免它?
答:
来自 react.dev“使用服务器”文档(强调我的):
服务器操作专为更新服务器端状态的突变而设计;不建议将它们用于数据获取。因此,实现服务器操作的框架通常一次处理一个操作,并且没有办法缓存返回值。
我仍然不明白为什么,以及它是如何详细工作的。这是在服务器端完成的吗?这是否意味着如果有很多用户,他们不会被例如.DB写入并行服务?
顶级域名;如果需要处理多个操作,请创建一个服务器操作来执行此操作。避免在客户端代码中按顺序调用多个服务器操作。
从 react.dev 的文档中,我们有两条信息可以更清楚地说明 OP 的问题:
服务器操作专为更新服务器端状态的突变而设计
- 有关在客户端代码中使用服务器操作的信息
服务器操作是公开的服务器终结点,可以在客户端代码中的任何位置调用。
这些告诉我们一件事,与 OP 可能想要查看它的方式相反,当通过客户端触发时,每个调用都被视为一个单独的 API 调用。这意味着作为函数的执行发生在服务器上,而不是在客户端上,因此,您不能期望在客户端上执行函数时获得相同的结果。printAB
printAB
因此,触发多个只会导致调用服务器端点,当这种情况发生时,我们会得到结果,OP包括如下,但包含更多信息:printAB
// f is a client code
function f(){
printAB()
printAB()
}
...
// two requests are made, since f is client code
// 1st request
A (from first printAB)
B (from first printAB)
//timeout is invoked.
// 2nd request
A (from second printAB)
B (from second printAB)
//timeout is invoked.
最后的话?我想说的是,查看服务器操作的一种方法是将您创建的每个服务器操作视为某种 API 端点,并且每个突变仅触发一个操作,虽然这是可能且允许的,但请避免多个操作调用,正如您在问题中概述的那样。
评论
f
ABC
ACB
A C B
f
A B C
A C B
A B C
A A B B
A B A B