我在 ReactJS 上创建了一个 Todo 应用程序,并使用了一些 firebase 函数来完成后端工作。现在,使用node-schedule,我通过传递一个日期和一个回调函数来设置提醒,该函数在执行时会更新 Firebase Firestore 中的一些值。这应该只使用 repo 的基于日期的调度执行一次,但 firebase 函数执行两次(一次未定义,一次成功,React 重新渲染可能导致 axios 问题,它发生而不是主要问题)并且回调函数会以非常短的随机间隔多次执行。我尝试记录以了解回调的执行,它只是随机记录。这里要注意的是只有回调函数不断被执行,而不是包含schedule.scheduleJob
.
此外,我尝试使用断点进行调试以了解 PHPStorm 中的流程,但由于某种原因,它什么也没做。
scheduleJob
功能:
if(projectId && taskId) {
const date = new Date(time); //Time is in 'DD/MM/YYYY hh:mm a' format
schedule.scheduleJob(date, () => {
console.log('reached');
const collectionPath = type === 'INBOX' ? userPath : projectPath;
console.log('collectionPath -> ' + collectionPath);
console.log('Project ID -> ' + projectId);
console.log('taskPath -> ' + taskPath);
console.log('Task ID -> ' + taskId);
db
.collection(collectionPath) //taskPath is a constant
.doc(projectId)
.collection(taskPath) //taskPath is a constant
.doc(taskId)
.get().then(async (task) => {
console.log('Printing Task Values');
console.log(task);
if(task.exists) {
//perform update operation
}
});
});
res.status(200).send('Task scheduled successfully'); //callback is never called by using end here
}
输出:( 日志甚至更长)
问题:回调继续执行,虽然,我已经阻止了内部 Firebase 逻辑(if(task.exists)
块中)的重复执行,基于应该更新的值是否已经更新,因此,内部逻辑只执行一次。但是,看到重复执行,可能会导致 CPU 功率浪费和不必要的计费。
我需要的解决方案:一种停止回调函数的多次执行的方法,或者一种更好的基于日期的调度程序以进行一次执行。
PS:我本可以在存储库上将此作为 github 问题提交,但存储库和问题现在几个月都没有活动。