调用云功能而无需等待响应

时间:2019-12-28 14:11:11

标签: javascript node.js typescript google-cloud-functions zeit-now

在这里尝试使用云功能进行一些修改,但似乎无法弄清问题所在。

我当前正在使用now.sh承载无服务器功能,并且想从另一个调用1个功能。可以说我有两个声明为fetchDatasetData的函数。调用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函数完成?

1 个答案:

答案 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会确认已收到执行请求,您现在可以放心,它将会并且可以在最高级别返回。