Javascript 正在等待Firebase查询的所有结果?

Javascript 正在等待Firebase查询的所有结果?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我将尽我最大的努力来解释这一点,因为我还不熟悉使用javascript和Firebase SDK。以下是我拥有的模拟数据: "Via" : { "00zz00" : { "coordinates" : "0,0", "order_number" : 1, "route_id" : "xyz987",

我将尽我最大的努力来解释这一点,因为我还不熟悉使用javascript和Firebase SDK。以下是我拥有的模拟数据:

    "Via" : {
    "00zz00" : {
      "coordinates" : "0,0",
      "order_number" : 1,
      "route_id" : "xyz987",
      "via_id" : "00zz00"
    },
    "1a2b3c" : {
      "coordinates" : "10,-10.1",
      "order_number" : 1,
      "route_id" : "abc123",
      "via_id" : "1a2b3c"
    },
    "2b3c4d" : {
      "coordinates" : "45.5,-24.7",
      "order_number" : 2,
      "route_id" : "abc123",
      "via_id" : "2b3c4d"
    },
    "3c4d5e" : {
      "coordinates" : "45.8,-24.0",
      "order_number" : 4,
      "route_id" : "abc123",
      "via_id" : "3c4d5e"
    },
    "4d5e6f" : {
      "coordinates" : "20.0,-20.0",
      "order_number" : 3,
      "route_id" : "abc123",
      "via_id" : "4d5e6f"
    }
  }
我首先使用.on()和“child_added”事件进行查询,用每个结果的坐标填充数组:

var waypoints = new Array();
var refVia = firebase.database().ref("Via");
refVia
    .orderByChild("route_id")
    .equalTo("abc123")
    .on("child_added", function (snapshot) {
        waypoints.push(snapshot.val().coordinates);
    });
我正在调用另一个API并使用该数组创建路由,我意识到我遇到了一个错误,因为我的数组仍然是空的。我找到了一个解决方案,提到使用.once().then()和“value”事件以及一个承诺,但我有点困惑如何从这里开始。我试过了,但是我有点迷路了

var refVia = firebase.database().ref("Via");
    return refVia
        .orderByChild("route_id")
        .equalTo("abc123")
        .once("value")
        .then(
            function (snapshot) {
                var via = [];
                
                //Not sure what to do here to add the entries to my array...

                return Promise.all(via);

            },
            function (error) {
                
                console.error(error);
            }
        );

我知道您需要迭代节点的键(它们等于
via_id
子节点值),以便定义通过
数组添加到
的承诺。因此,以下几点应该可以做到:

  var refVia = firebase.database().ref('Via');
  return refVia
    .orderByChild('route_id')
    .equalTo('abc123')
    .once('value')
    .then((snapshot) => {
      const via = [];
      for (const [key, value] of Object.entries(snapshot.val())) {
        console.log(`${key}: ${value.via_id}`);
        via.push(*** here build the Promise based on the key value ***)

        // example with Axios https://github.com/axios/axios
        via.push(axios.get('https://..../via?ID=' + key));
      }
      
      return Promise.all(via);
    })
    .then(results => {
      // results is an Array of results of each call to the API
      // For example
      results.forEach(r => {
        // ...
      })
    })
    .catch((error) => {
      console.error(error);
    });

明天我会测试这个,因为我就要出发了。如果我理解正确,我应该能够获得构建承诺的“坐标”子值?您需要将承诺数组传递给
Promise.all
。因为调用API,所以需要使用Axios或fetch之类的库来执行调用并获得承诺。由于您没有提供有关API URL的详细信息,因此很难提供更多帮助。