Установка таймаута в коде JavaScript / машинописи для облачных функций - PullRequest
0 голосов
/ 22 января 2019

В настоящее время я пытаюсь отложить некоторые действия с облачным пожарным хранилищем, но setTimeout / setInterval, похоже, не работает для моего кода.

export const onTimerCreate = functions.firestore

.document("File/One")
.onCreate((snapshot, context) => {
  setTimeout(countdown, 5000);
  const messageData = snapshot.data()

  const delay = countdown()
  return snapshot.ref.update ({ delay : delay })
})

function countdown() {
  return 0
}

Я пытаюсь удостовериться, что снимок обновляется с новым значением после этой задержки в 5 секунд, но это происходит мгновенно каждый раз ... не знаю, что делать?

1 Ответ

0 голосов
/ 22 января 2019

Первым делом - вы не можете отложить запись в Firestore с помощью облачных функций. Я не могу точно сказать, пытаетесь ли вы здесь это сделать, но если это так, вы должны отказаться от этой идеи прямо сейчас. Облачные функции срабатывают только после , некоторые действия уже выполнены. Вы не можете перехватить запись. Вы можете предотвратить запись с помощью правил безопасности, но правила безопасности не позволяют эффективно задерживать запись. Запись произойдет как можно быстрее.

Предполагая, что вы действительно хотите просто что-то сделать с задержкой после записи происходит, вы можете использовать setTimeout, но помните, что вы платите за время ЦП, связанное с этими 5 секундами.

Поскольку фоновые функции требуются для возврата обещания, которое разрешается только после того, как весь фон завершен, вам необходимо создать и организовать разрешение, которое будет выполнено для этого обещания после истечения времени ожидания и после завершения любой другой асинхронной работы. Поскольку вы используете TypeScript (или, по крайней мере, отметили его здесь), async / await - самый простой способ сделать это:

export const onTimerCreate = functions.firestore
.document("File/One")
.onCreate(async (snapshot, context) => {
  await sleep(5000)

  const messageData = snapshot.data()
  await snapshot.ref.update ({ delay : delay })
})

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...