我正在使用Cloud Functions for Cloudbase:
我对第三方API的调用使用了request Node.js module,并且包含在index.js中的函数(getInfoFromApi()
)中。
我遇到的问题是辅助函数调用的执行始终需要15-20秒。注意:云功能本身在400 ms范围内始终如一地完成执行。
通过将简单注释记录到控制台,我可以看到函数何时启动,何时调用辅助函数以及何时收到第三方的响应,所以我想我可以看到发生了什么。
粗略地说,时间看起来像这样:
getInfoFromApi()
函数被调用(!)我的问题:
您可以在此处查看index.js的简化要点:https://gist.github.com/anonymous/7e00420cf2623b33b80d88880be04f65
以下是Firebase控制台的示例,其中显示了示例时间。注意:输出与上面的代码略有不同,因为我简化了上面的代码以帮助理解。
答案 0 :(得分:1)
getInfoFrom3rdParty()
调用是异步事件。但是,您尚未从函数返回promise,因此Functions不会等待异步事件完成。
在我看来,因为你返回undefined,函数也假定它失败并重试。在重试过程中的某个时刻,异步事件可能在函数退出之前完成(即由于竞争条件而无意中成功)。在其他用户没有在函数中返回承诺或值的情况下,我看到了类似的结果。
我无法从要点中分辨出您正在尝试做什么 - 它实际上似乎没有对第三方结果做任何事情,并且可能不是您的用例的真实情况。但是这样的事情可能就是你想要的:
exports.getInfo = functions.https.onRequest((request, response) => {
// ....
// NOTE THE RETURN; MOST IMPORTANT PART OF THIS SAMPLE
return getInfoFromThirdParty(...).then(() => {
response.writeHead(200, {"Content-Type": "application/json"});
response.end(JSON.stringify(payload));
}).catch(e => /* write error to response */);
});
function getInfoFrom3rdParty(food) {
reqObj.body = '{"query": "'+food+'"}';
return new Promise((resolve, reject) => {
mainRequest(reqObj, function (error, response, body) {
// ....
if( error ) reject(error);
else resolve(...);
// ....
});
});
}
答案 1 :(得分:0)
根据我对云功能的体验,一旦“执行完成”标志完成,它将导致延迟(从3秒到15秒)。这会阻止剩余的执行并增加您的总响应时间。
为了解决这个问题,你可以尝试在你的第三方通话中设置一个Promise,一旦完成,然后执行“response.send()”,结束这个功能。