Javascript 在不等待响应的情况下调用云函数

Javascript 在不等待响应的情况下调用云函数,javascript,node.js,typescript,google-cloud-functions,vercel,Javascript,Node.js,Typescript,Google Cloud Functions,Vercel,在这里尝试一下云功能,但似乎无法找出问题所在 我目前正在使用now.sh托管无服务器函数,并希望从另一个函数调用1个函数。假设我声明了两个函数fetchData&setData。调用setData函数时,它会处理一些数据,然后调用fetchData函数 export const setData=async(请求:请求,响应:响应)=>{ 等待axios.post( fetchDataEndpointUrl, { 参数:{ 钥匙 }, }, ); 返回res.json({ 有效载荷:对, });

在这里尝试一下云功能,但似乎无法找出问题所在

我目前正在使用now.sh托管无服务器函数,并希望从另一个函数调用1个函数。假设我声明了两个函数
fetchData
&
setData
。调用
setData
函数时,它会处理一些数据,然后调用
fetchData
函数

export const setData=async(请求:请求,响应:响应)=>{
等待axios.post(
fetchDataEndpointUrl,
{
参数:{
钥匙
},
},
);
返回res.json({
有效载荷:对,
});
}

上面的代码工作正常,但完成整个操作所需的时间是setData函数调用+fetchData函数调用完成所需的时间。我试图做的是调用
fetchData
,而不必等待它完成基本上删除axios调用中的
wait
。我已尝试删除
wait
,但当
setData
调用结束时,调用突然结束。有没有一种方法可以将此操作解耦,而不必等待
setData
函数完成?

您的问题的摘要是,当您调用云函数时,您希望它能够在执行后台工作(如调用另一个服务并等待响应)的同时向其调用者返回值

当您向云函数的调用者返回一个值时,这就是云函数生命周期的结束。你无法保证任何一种生活在云功能之外的回报

这是有案可查的

案文(部分)如下:

函数只能访问请求的资源(CPU和内存) 在函数执行期间。代码在外部运行 执行期间不保证执行,可以停止 随时都可以。因此,你应该总是发出结束你工作的信号 正确执行函数并避免运行超出它的任何代码

问题的另一部分是,如果我们想让云函数在不关心等待响应的情况下进行异步REST调用,该怎么办。我们可以在不等待嵌套的REST调用完成的情况下从云函数返回吗

答案可能是,但这将取决于所调用服务的性质以及我们如何调用它。要理解其中的细微差别,请记住JavaScript是一种单线程语言。没有多个执行线程。在我们的JavaScript应用程序中,一次只能发生一件事。如果我们进行一个异步REST调用,不关心回复,但(显然)关心请求是否已发送,那么我们需要在终止云功能之前同步发送请求。如果我们开始使用库包而不深入研究它们的本质,这可能会变得很棘手。例如,REST调用可能包括:

  • 到伙伴的套接字连接
  • 出站请求的传输
  • 收到响应时的回调
在结束顶级云函数调用之前,我们需要绝对确保传输已经发生。此外,如果我们确实结束顶级云函数调用,那么很可能会减少用于响应的套接字。这可能导致被调用的REST服务出现异常,该服务现在无法返回其200响应


为了在我们不需要也不想等待响应的地方运行工作,GCP为此提供了一个架构解决方案。它被称为“云任务”(请参阅)。在云函数中,您将定义一个异步调用嵌套服务的请求,并将该请求交给云任务执行。云任务将确认收到执行请求,您现在可以确信它将在最高级别返回。

本质上
setData
是一项后台任务。我不确定now.sh上的
基础设施,但您通常会使用一些
pub/sub
架构来实现这一点。我在
GCP
上做过类似的事情
setData
是否接受
next
参数?也许在链的第一个块中返回响应,然后在单独的块中调用axios函数就可以了@shukar考虑到这是一个无服务器架构,我不认为通过网络传递
next
函数会有任何用途。我对Firebase云函数也做过类似的事情,我会使用一个“触发器”HTTPS请求,这会将预期的作业保存到Cloud Firestore,而Cloud Firestore则会触发a来完成长期运行的工作。这样做的好处是,客户端还可以监听Firestore文档的更新,以获取文档中的结果。实际上,我不需要等待后台任务的响应,我只需要它自己启动并执行。考虑到这些都是独立的云函数,从另一个函数调用一个函数不算是一个单独的云函数调用吗?为什么它被认为是一个后台任务?我试图在答案中添加更多的词。我们可能还想在答案中将云任务视为一个组件。@Kolban我相信我们仍然需要等待云任务确认收到。因此,如果我们调用的服务的ping时间比“CloudTask-Acknowledge”请求的ping时间要长,那么解决方法是有意义的,对吗?您认为从GCP功能调用“第三方电子邮件服务”可行吗?@Mehari。。。我认为我们应该调用云任务来安排要执行的任务,并在完成云函数调用之前等待对云任务的调用完成。