js异步函数不等待内部forEach循环

时间:2019-11-19 22:22:17

标签: javascript firebase foreach promise async-await

在主函数中,我想调用一系列需要先等待上一个函数完成的函数。

我希望我的控制台输出:A,B,B,B,B,C,D。其中,对于snapPivot中的每个项目,B都会出现几次。

我现在得到的结果是:A,C,D,B,B,B,B

似乎getPivot函数没有等待内部循环完成。在继续进行console.log('b')console.log('c')

之前,如何确保getPivot函数首先用console.log('d')完成内部循环。

主要功能:

    dashboardListner
      .child(activeDashboardId)
      .child('widgets')
      .once('value', snap => {
          widgets = snap.val();
      })
      .then(thenWidgets => {
        async function asyncCall() {
          console.log('A');
          Object.entries(thenWidgets.val()).map(async function(widget) {
            return await getPivot(widget, userId);
          });
          console.log('C');
        }
        return asyncCall();
      })
      .then(pivotData => {
        async function asyncCall2() {
          console.log('D');
          return await getMain(pivotData);
        }
        return asyncCall2();
      })

getPivot函数:

const getPivot = (widget, userId) => {
  return new Promise(resolve => {
    const pivotData = {};
    //Get get pivot table name
    const pivotName =
      'user' + widget[1].type.charAt(0).toUpperCase() + widget[1].type.slice(1);

    //Get pivot data into widget object
    const pivotRef = firebase
      .database()
      .ref()
      .child(pivotName)
      .child(userId);

    pivotRef
      .once('value', snapPivot => {
        return Promise.all([
          snapPivot.forEach(function(result) {
            if (result.val().widgetId === widget[0]) {
              pivotData[result.key] = result.val();
              console.log('B');
            }
          }),
        ]);
      })
      .then(() => {
        resolve(pivotData);
      });
  });
};

0 个答案:

没有答案