Node.js 慢承诺链

Node.js 慢承诺链,node.js,promise,google-cloud-functions,Node.js,Promise,Google Cloud Functions,一般来说,我对node.js和promissions是相当陌生的,尽管我想我已经了解了它们应该如何工作的要点(我被迫使用ES5已经很久了)。我对云功能(GCF)也没有什么深入的了解,不过我还是很了解它们是如何工作的 我的应用程序的一部分使用了GCF,这意味着接收HTTP请求,翻译它们并将它们发送到另一个端点。我需要使用承诺,因为有时原始HTTP请求会同时发送多条“消息” 因此,我的功能是确保消息以正确的顺序发送,但后续消息的发送速度非常慢(日志显示实际发送时间相差约20秒) 我不完全清楚为什么会

一般来说,我对node.js和promissions是相当陌生的,尽管我想我已经了解了它们应该如何工作的要点(我被迫使用ES5已经很久了)。我对云功能(GCF)也没有什么深入的了解,不过我还是很了解它们是如何工作的

我的应用程序的一部分使用了GCF,这意味着接收HTTP请求,翻译它们并将它们发送到另一个端点。我需要使用承诺,因为有时原始HTTP请求会同时发送多条“消息”

因此,我的功能是确保消息以正确的顺序发送,但后续消息的发送速度非常慢(日志显示实际发送时间相差约20秒)

我不完全清楚为什么会发生这种情况——我本以为相差不到几秒钟。也许这与GCF有关,而不是我的代码?或者是我的密码?不管是哪种方式,我想知道我是否可以做些什么来加速它,特别是因为它应该将它发送给Google chat中的用户

(在任何人评论它为什么是request.body.body之前,我无法控制传入请求的格式)

exports.forward=(请求、响应)=>{
response.status(200.send();
让bodyArr=request.body.body;
//存储在bodyArr中的一次发送的多条消息的链承诺
bodyArr.reduce(异步(上一个、下一个)=>{
等待前世;
返回过程(下一步);
},Promise.resolve());
};
功能过程(主体){
返回新承诺((解决、拒绝)=>{
//从谷歌获得JWT
让jwtClient=new google.auth.JWT(
privatekey.client_电子邮件,
无效的
私钥,私钥,
['https://www.googleapis.com/auth/chat.bot']
);
//酌情授权JWT、拒绝承诺或继续
jwtClient.authorize((错误,令牌)=>{
如果(错误){
console.error('googleoauth失败'+err);
拒绝();
}否则{
让有效载荷=copyPayload();
setValues(有效载荷,body);//设置有效载荷值的其他函数
axios.post(url、有效负载、,
{
标题:{
“内容类型”:“应用程序/json”,
“接受”:“应用程序/json”,
“授权”:“持有人”+令牌。访问令牌
},
})
。然后(响应=>{
//收到HTTP 2xx响应
解决();
})
.catch(错误=>{
开关(真){
//发生了不好的事
拒绝();
});
}
});
});
}
编辑:在测试了同样的东西之后,承诺之间的延迟大约为3-6秒。鉴于代码没有改变,我怀疑这与GCF有关?

通过这样做

exports.onward = (request, response) => {
    response.status(200).send();

    let bodyArr = request.body.body;

    // Any work
};
您错误地管理了云功能的生命周期:事实上,您执行了
response.status(200).send();
您向云功能平台表明,您的功能已成功达到其终止条件或状态,因此平台可以将其关闭。有关更多说明,请参阅文档中的

由于您在云函数的开头发送此信号,因此可能会发生云函数在异步作业完成之前将其关闭的情况

此外,您可能会生成一些“不稳定的”导致调试困难的云函数行为。有时,由于上述原因,您的云函数在异步工作完成之前终止。但有时,云函数平台不会立即终止函数,异步工作可以完成(即有可能在云功能终止前完成)

因此,您应该在所有工作完成后发送响应


如果您希望立即向用户确认工作已经开始,而不必等待此工作完成,则应使用:在主云函数中,将工作委托给,然后返回响应

如果您希望在工作完成时(即,发布/订阅触发的云功能完成时)向用户致谢,则有几个选项:发送通知、电子邮件或向您在应用程序中观看的Firestore文档写入内容。

exports.onward = (request, response) => {
    response.status(200).send();

    let bodyArr = request.body.body;

    // Any work
};
您错误地管理了云功能的生命周期:事实上,您执行了
response.status(200).send();
您向云功能平台表明,您的功能已成功达到其终止条件或状态,因此平台可以将其关闭。有关更多说明,请参阅文档中的

由于您在云函数的开头发送此信号,因此可能会发生云函数在异步作业完成之前将其关闭的情况

此外,您可能会生成一些“不稳定的”导致调试困难的云函数行为。有时,由于上述原因,您的云函数在异步工作完成之前终止。但有时,云函数平台不会立即终止函数,异步工作可以完成(即有可能在云功能终止前完成)

因此,您应该在所有工作完成后发送响应


如果你想马上知道