首页 > 解决方案 > Firebase 云功能在所有功能运行之前完成

问题描述

我正在尝试调用以下函数。已经尝试过 await 和 Promise.all() 但我仍然看到我的 firebase 函数在 get 请求返回之前执行完成。代码最终完成,但由于 firebase 的工作方式,它需要 2 或 3 分钟,因为 firebase 将其作为某种后台任务运行。

我已经在执行函数的每一行都记录了日志。当它到达调用 (request.get) 的行时,firebase 停止并退出。我也尝试在此处添加等待,但代码不会阻塞并等待。

function fetchUserLogoBase64(userId) {
  return new Promise(async function(resolve, reject) {
    const userSettings = await getDocument("user-settings", userId);
    const downloadUrl = userSettings.company.logoDownloadUrl;

    if (!downloadUrl) return null;

    request.get(downloadUrl, function(error, response, body) {
      if (!error && response.statusCode === 200) {
        data =
          "data:" +
          response.headers["content-type"] +
          ";base64," +
          new Buffer(body).toString("base64");
        resolve(data);
      }
      reject(error);
    });
  });
}

标签: javascriptfirebaseasync-awaitgoogle-cloud-functions

解决方案


您将 promise 与async/混合在一起await,这使得使用任何一个都更难跟踪正在发生的事情。我建议选择 promises 或async/await并仅使用它。

使用纯 Promise,此代码将如下所示:

function fetchUserLogoBase64(userId) {
  return new Promise(function(resolve, reject) {
    getDocument("user-settings", userId).then(function(userSettings) {
      const downloadUrl = userSettings.company.logoDownloadUrl;

      if (!downloadUrl) resolve();

      request.get(downloadUrl, function(error, response, body) {
        if (!error && response.statusCode === 200) {
          data =
            "data:" +
            response.headers["content-type"] +
            ";base64," +
            new Buffer(body).toString("base64");
          resolve(data);
        }
        reject(error);
      });
    });
  });
}

推荐阅读