首页 > 解决方案 > Firebase onCall 方法在代码执行完成之前完成

问题描述

我有一个相当密集的 Node 函数,其中包括多个 aync 任务,这些任务在进入下一步之前等待上一个操作完成。整个任务在被调用时完成是至关重要的。我看到onCall函数将在代码执行完成之前结束的问题。我可以在日志中看到这一点,因为我正在控制台记录从上到下调用​​的各种方法,直到函数“完成”。父函数在这里:

exports.myHandyFunction = functions.https.onCall((data, context) => {
  return new Promise((resolve, reject) => {
    const response = async () => {
      try {
        let result = await some_main_function_elsewhere_in_code();
        resolve(result)
      } catch (err) {
        console.log('parent promise caught error:')
        console.log(err)
        reject(err)
      }
    }

    response()
  })
})

我已经将函数的超时从 60 秒增加到 240 秒,希望这纯粹是一个函数超时问题?这非常令人不安,因为我调用了一些复杂的逻辑,但最终没有完全完成。任何帮助将不胜感激。

标签: node.jsfirebase

解决方案


您的response功能是异步的。当您调用它时,您不会等待它的执行。这导致 oncall 方法执行的过早结束。

您可以像这样更改代码,而不是将业务逻辑包装在异步函数中,包装在 Promise 中:

exports.myHandyFunction = functions.https.onCall((data, context) => {
  return new Promise(async (resolve, reject) => {
    try {
      let result = await some_main_function_elsewhere_in_code();
      resolve(result)
    } catch (err) {
      console.log('parent promise caught error:')
      console.log(err)
      reject(err)
    }
  })
})

基本上,Promise 被声明为异步,因此我们可以在其中使用 await 构造函数。然后,我们只需要调用 some_main_function_elsewhere_in_code 方法,等待它。


推荐阅读