Firebase 在任意时间间隔重试Google Cloud函数

Firebase 在任意时间间隔重试Google Cloud函数,firebase,google-cloud-platform,google-cloud-functions,Firebase,Google Cloud Platform,Google Cloud Functions,我有一个GoogleCloud应用程序,有几个云函数调用API,然后将响应保存在Firebase中。我已经设置了这个预定函数,以便在API出错时重试,它工作得很好。但是如果我需要的数据还不存在,我想重试这个呼叫。如果我抛出一个错误,立即再次调用可能会起作用,但丢失的数据在几秒钟后不太可能可用,因此我宁愿在这之后每小时检查一次,直到获得有效数据 下面是我的函数的简化版本。我可以想象添加一个setTimeout并再次调用函数本身,但我不确定我是否会这样做,或者这是否是一个好主意,因为它将使函数保持长

我有一个GoogleCloud应用程序,有几个云函数调用API,然后将响应保存在Firebase中。我已经设置了这个预定函数,以便在API出错时重试,它工作得很好。但是如果我需要的数据还不存在,我想重试这个呼叫。如果我抛出一个错误,立即再次调用可能会起作用,但丢失的数据在几秒钟后不太可能可用,因此我宁愿在这之后每小时检查一次,直到获得有效数据

下面是我的函数的简化版本。我可以想象添加一个setTimeout并再次调用函数本身,但我不确定我是否会这样做,或者这是否是一个好主意,因为它将使函数保持长时间的活动。是否有办法在任意时间间隔内自动重试此计划函数

exports.fetchData= functions.pubsub
    .schedule('every Tuesday 6:00')
    .timeZone('America/New_York')
    .onRun(async context => {
            const response =  fetch(...)
            .then(res => {
                if (res.status < 400) {
                    return res;
                } else {
                    throw new Error(`Network response was not ok. ${res}`);
                }
            })
            .then(res => res.json());

        const resObj = await response;

        resObj.map(x => {
            // check response for valid data
        })

        if (// data is valid) {
          // save to Firebase 
        } else {
          // retry in 1 hour
        }
    });
});
exports.fetchData=functions.pubsub
.时间表(每周二6:00)
.时区(“美国/纽约”)
.onRun(异步上下文=>{
const response=fetch(…)
。然后(res=>{
如果(分辨率状态<400){
返回res;
}否则{
抛出新错误(`网络响应不正常。${res}`);
}
})
。然后(res=>res.json());
const resObj=等待响应;
resObj.map(x=>{
//检查响应中的有效数据
})
如果(//数据有效){
//保存到Firebase
}否则{
//1小时后重试
}
});
});

计划功能仅在指定的计划上运行。不存在“任意”调度。如果您认为函数可能经常失败,请考虑仅仅增加日程的频率,并跳出不需要因为最近的成功而运行的函数调用。 如果您选择了,并且函数通过抛出异常、返回拒绝的承诺或超时而生成错误,那么云函数将按照您无法控制的计划自动重试函数

setTimeout是一个不可行的选项,它不能使函数的活动时间超过其配置的超时时间。在超时过期后,云函数将终止函数及其所有正在进行的工作(并且您将为函数闲置的时间付费,这是一种浪费)