Firebase云功能在所有功能运行之前完成

时间:2020-03-17 20:01:31

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

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

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

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);
    });
  });
}

1 个答案:

答案 0 :(得分:0)

您正在将诺言与async / await混合使用,这使得跟踪发生的事情甚至变得更加困难。我建议选择诺言或async / await并仅使用它们。

纯粹的承诺,这段代码看起来像:

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);
      });
    });
  });
}