等待while循环中的异步方法

时间:2018-02-26 16:20:53

标签: javascript node.js promise

我有一个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。插入完成后,如何在循环中使用它们。我怎么知道一切都已完成所以我可以回来?

2 个答案:

答案 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);

https://www.sitepoint.com/recursion-functional-javascript/

答案 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!';
}

或类似的东西,我没有运行它。