Облачная функция Firebase завершается до запуска всех функций - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь вызвать следующую функцию. Я пробовал await и Promise.all (), но я все еще вижу, что выполнение моих функций firebase завершено до возвращения запроса get. Код в конце концов завершается, но из-за того, как работает 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 голосов
/ 17 марта 2020

Вы смешиваете обещания с 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);
      });
    });
  });
}
...