我目前正在尝试延迟使用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秒钟的延迟后以新值更新,但是每次都会立即发生……不确定该怎么办?
答案 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));
}