我正在使用Firebase的云函数来:
我对第三方API的调用使用请求Node.js模块,并封装在index.js中的一个函数(getInfoFromApi())中。
我遇到的问题是,次要函数调用的执行时间总是在15-20秒之间。注意:云函数本身在400 ms范围内一致地完成了它的执行。
通过将简单的注释记录到控制台,我可以看到函数何时启动、次要函数何时被调用以及它何时收到来自第三方的响应,因此我想我可以看到发生了什么。
大致上,时间安排如下:
getInfoFromApi()函数(!)我的问题:
您可以在这里看到一个简化的index.js要点:https://gist.github.com/anonymous/7e00420cf2623b33b80d88880be04f65
这里是Firebase控制台的一个抓取,显示了示例时间。注意:输出与上面的代码略有不同,因为我简化了上面的代码以帮助理解。

发布于 2017-04-13 17:38:29
getInfoFrom3rdParty()调用是一个异步事件。但是,您还没有从函数中返回承诺,因此函数不会等待异步事件的完成。
在我看来,由于您返回的是未定义的,所以函数也假设它失败并重试。在重试过程的某个时候,异步事件可能是在函数退出之前完成的(即由于竞争条件而无意中的成功)。在其他情况下,我也看到了类似的结果,即用户在其功能中不返回承诺或价值。
我无法从要点中看出你想要做什么--它似乎并没有对第三方的结果做任何事情,而且可能也不是你的用例的现实内容。但是这样的事情可能是你想要的:
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(...);
// ....
});
});
}发布于 2018-01-19 08:47:49
根据我处理云函数的经验,一旦“执行完成”标志完成,它将导致延迟(从3s到15s)。这将阻止其余的执行,并增加您的总响应时间。
为了克服这个问题,您可以尝试对第三方调用作出承诺,一旦它完成,然后执行结束函数的"response.send()“。
https://stackoverflow.com/questions/42934796
复制相似问题