【问题标题】:Firebase cloud function completing before all functions have runFirebase 云功能在所有功能运行之前完成
【发布时间】:2020-06-28 22:47:55
【问题描述】:

我正在尝试调用以下函数。已经尝试过 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);
    });
  });
}

【问题讨论】:

  • 这里没有足够的信息来了解发生了什么。我会注意到您不必要地创建了一个新的 Promise 对象 - 这不是必需的。请编辑问题以提供 MCVE:stackoverflow.com/help/minimal-reproducible-example
  • 此处使用的 @DougStevenson request.get() 不会返回承诺,这可能是 OP 明确创建自己的承诺的原因。
  • @FrankvanPuffelen 哦,好吧,request 有一个版本,它返回一个承诺。令人惊讶的是,它被称为request-promise
  • 是的,这是一个附加包。尽管现在大多数人转而使用fetch

标签: javascript firebase async-await google-cloud-functions


【解决方案1】:

您将 promise 与 async / await 混合使用,这使得使用任何一个都更难跟踪正在发生的事情。我建议选择 Promise 或 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);
      });
    });
  });
}

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 2020-05-18
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多