我有一个while循环,从一个日期循环到另一个日期。我想将一些数据提交给firebase实时数据库。
我想提交,并等到结果回来。然后转到下一次迭代。
var loop = moment(startDate, 'MM-DD-YYYY').toDate();
var end = moment(endDate, 'MM-DD-YYYY').toDate();
while(loop <= end){
firebaseAdmin.database().ref('test/data').set({}).then(function(){
}).catch(function(error) {
});
const newDate = loop.setDate(loop.getDate() + 1);
loop = new Date(newDate);
}
firebase数据库使用promises。插入完成后,如何在循环中使用它们。我怎么知道一切都已完成所以我可以回来?
答案 0 :(得分:2)
你可以递归地执行此操作,因为只有当前请求成功时才想继续,如下所示:
var loop = moment(startDate, 'MM-DD-YYYY').toDate();
var end = moment(endDate, 'MM-DD-YYYY').toDate();
function fetchDataRec(loop, end)
{
if(loop <= end) return;
firebaseAdmin.database().ref('test/data').set({}).then(function(){
if(/*check if you want to continue*/) {
const newDate = loop.setDate(loop.getDate() + 1);
loop = new Date(newDate);
fetchDataRec(loop, end);// loop while refactored to recursion
}
}).catch(function(error) {
});
}
fetchDataRec(loop, end);
答案 1 :(得分:0)
有几种方法(例如,您可以使用.reduce()
创建一系列承诺)
但这些天最好的方法是使用async
函数:
async function insertMany(startDate, endDate) {
var loop = moment(startDate, 'MM-DD-YYYY').toDate();
var end = moment(endDate, 'MM-DD-YYYY').toDate();
while(loop <= end){
try {
await firebaseAdmin.database().ref('test/data').set({});
// bla bla
} catch (e) {
// bla bla
}
const newDate = loop.setDate(loop.getDate() + 1);
loop = new Date(newDate);
}
return 'all done!';
}
或类似的东西,我没有运行它。