在这里尝试使用云功能进行一些修改,但似乎无法弄清问题所在。
我当前正在使用now.sh承载无服务器功能,并且想从另一个调用1个功能。可以说我有两个声明为fetchData
和setData
的函数。调用setData
函数时,它将处理一些数据,然后调用fetchData
函数。
export const setData = async (req: Request, res: Response) => {
await axios.post(
fetchDataEndpointUrl,
{
params: {
key,
},
},
);
return res.json({
payload: true,
});
}
上面的代码可以正常工作,但是整个操作完成所需的时间将为setData函数调用+ fetchData函数调用完成的时间。我想做的是对fetchData
进行调用,而不必等待它实质上完成了在axios调用中删除await
的过程。我曾尝试删除await
,但是当setData
通话结束时,通话突然结束。有没有一种方法可以使此操作脱钩,而不必等待setData
函数完成?
答案 0 :(得分:1)
问题的总结似乎是,当您调用Cloud Function时,您希望它能够在执行后台工作(例如调用其他服务并等待响应)的同时将值返回给其调用方。
将值返回给Cloud Function的调用者时,即Cloud Function的寿命结束。您无法保证Cloud Function中除回报以外的任何 life 。
已记录在here中。
文本(部分)显示为:
一个功能只能访问所请求的资源(CPU和内存) 在函数执行期间。代码在 执行周期不能保证执行,可以将其停止 随时。因此,您应该始终向您发出结束信号 函数正确执行,并避免运行超出此范围的任何代码。
问题的另一部分是,如果我们想让我们的Cloud Function进行异步REST调用,而又不关心等待响应,该怎么办。我们可以从Cloud Function返回,而不必等待嵌套的REST调用完成吗?
答案可能是也许,但这取决于所调用的服务的性质以及我们如何调用它。要了解其中的细微差别,请记住JavaScript是一种单线程语言。没有多个执行线程。在我们的JavaScript应用中,一次只会发生一件事。如果我们进行异步REST调用并且不关心答复,但是(显然)关心请求已发送,那么我们需要在终止Cloud Function之前同步发送请求。如果我们开始使用库包而不去研究它们的性质,这可能会变得棘手。例如,REST调用可能包括:
我们必须绝对确保在结束顶级Cloud Function调用之前发生了传输。此外,如果我们确实结束了顶层Cloud Function调用,则很可能会减少用于响应的套接字。这可能会导致被调用的REST服务出现异常,该异常现在无法返回其200响应。
要在不需要或不想等待响应的地方进行工作,GCP为此提供了一种体系结构的解决方案。它称为“云任务”(请参阅Cloud Tasks)。在您的Cloud Function中,您将定义一个请求以异步方式调用嵌套服务,并将该请求交给Cloud Tasks执行。 Cloud Tasks会确认已收到执行请求,您现在可以放心,它将会并且可以在最高级别返回。