谷歌云函数完成执行但从不进入回调

Posted

技术标签:

【中文标题】谷歌云函数完成执行但从不进入回调【英文标题】:Google Cloud Function Finishes Execution But Never Enters Callbacks 【发布时间】:2018-04-18 15:23:05 【问题描述】:

我正在尝试发出约 25 个请求来获取一些数据并将响应保存到单独的文件中。 我正在使用 npm 请求模块通过基本的谷歌云功能发出请求。每个请求可能需要 0.5 到 5 秒的时间来返回响应。当脚本设置为发出少于 10 个请求时,一切都按预期工作并将所有内容保存到正确的文件中。然而,除此之外,我没有得到任何请求的回应。

for (i = 0; i < popIDS.length; i++) 
    for (j = 0; j < genreIDs.length; j++) 
        fetchAndSaveToFile(popIDS[i], genreIDs[j], date);            
    
  

fetchAndSaveToFile 发出 npm 请求并使用 pako 将压缩响应保存到 Google Cloud Storage 中的文件中。这最初是发出约 5 个请求的问题,但我增加了函数的超时并开始工作,但是我将函数的超时设置为 9 分钟。目前所有函数都在一个文件中。

另外值得注意的是,popIDS[i]、genreIDs[j] 的值并没有在回调中使用,并且 'i' 和 'j' 不需要被捕获。

我是否需要以不同的方式发出异步请求才能使其正常工作?我看到有处理这类事情的异步请求模块。是否有需要配置的功能设置?还是我需要将其拆分为单独的文件,以便我可以为每个请求设置 9 分钟的超时时间?

【问题讨论】:

javascript closure inside loops – simple practical example的可能重复 @BrahmaDev 我没有在回调中捕获IJ,所以我不确定它是否相关。 【参考方案1】:

我能够通过更新使用Promise.all() 并使用new Promise 将请求调用映射到promise 对象来解决。将Promise.all() 返回到主 Google Cloud 函数主体,让函数知道在退出函数之前等待所有承诺完成。实现回调而不是 Promise 可能会导致 Google 云函数在所有回调完成之前提前退出。

【讨论】:

以上是关于谷歌云函数完成执行但从不进入回调的主要内容,如果未能解决你的问题,请参考以下文章

从谷歌云功能排队大量任务

如何将值从谷歌云函数(firebase)传递到前端?

谷歌云函数快速入门

谷歌云函数:返回有效的 JSON

谷歌云函数抛出 404 错误

谷歌云 pubsub node.js 客户端与谷歌云功能不兼容