Javascript 正在等待Firebase查询的所有结果?
我将尽我最大的努力来解释这一点,因为我还不熟悉使用javascript和Firebase SDK。以下是我拥有的模拟数据: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",
"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的详细信息,因此很难提供更多帮助。