在javascript / typescript代码中为云功能设置超时

时间:2019-01-21 22:25:08

标签: javascript typescript firebase google-cloud-functions

我目前正在尝试延迟使用Cloud Firestore的某些操作,但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 :(得分:2)

首先是第一件事-您不能延迟使用Cloud Functions写入Firestore。我不能确定这是否是您要在此处执行的操作,但是如果是这样,则应立即放弃该想法。云功能仅在已经执行某些操作后触发。您无法拦截写入。您可以使用安全规则阻止写操作,但是安全规则不会有效地允许您延迟写操作。写操作将尽快完成。

假设您确实确实想在发生写后 之后延迟执行某些操作,则可以使用setTimeout,但是请注意,您要为与这5秒相关的CPU时间付费。 / p>

由于需要后台函数返回仅在所有后台完成后才能解决的promise,因此您需要创建并安排该Promise在超时结束后以及任何其他异步工作完成后解决。由于您使用的是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));
}