在我的项目中,我从 firebase 获取订单 ID,然后根据该 ID 获取每个订单 最后想将该订单推送到我的 orderList 数组。
但是 orderList 数组总是空的,我认为从 for 循环中将值插入数组时会出现问题,但找不到解决方案。
我该如何解决这个问题并将值推送到 orderList?
fetchOrders({commit, getters, state}) {
var orderList = [];
service.fetchUserOrdersIds(getters.user.id).then(snapshot => {
var tempOrderIds = snapshot.val();
for (let key in tempOrderIds) {
firebase
.database()
.ref("orders")
.child(tempOrderIds[key])
.once("value")
.then(orderSnap => {
orderList.push(orderSnap.val());
});
}
});
commit("setUserOrders", orderList);
}
编辑:我找到了一个解决方案,但它有点脏。我认为可能有更好的解决方案
fetchOrders({commit, getters, state}) {
var orderList = [];
service.fetchUserOrdersIds(getters.user.id).then(snapshot => {
var tempOrderIds = snapshot.val();
var size = Object.keys(tempOrderIds).length;
var i = 0;
for (let key in tempOrderIds) {
firebase
.database()
.ref("orders")
.child(tempOrderIds[key])
.once("value")
.then(orderSnap => {
orderList.push(orderSnap.val());
if (i == size) commit("setUserOrders", orderList);
});
i++;
}
});
},
最佳答案
您的 commit()
函数接收到一个空的 orderList
因为它在 promise
之前被触发填充 orderList
的内容已完成。
这里是一个简单的修改,它保留了您设置的代码结构 - 但等待触发 commit()
函数,直到生成 orderList
数组:
fetchOrders({commit, getters, state}) {
return service
.fetchUserOrdersIds(getters.user.id) // promist to get snapshot
.then(snapshot => { // promise to generate orders list based on snapshot
var listOfOrderPromises = [];
var tempOrderIds = snapshot.val();
for (let key in tempOrderIds) {
var thisOrderPromise = firebase // create a promise to get this order value
.database()
.ref("orders")
.child(tempOrderIds[key])
.once("value")
.then(orderSnap => {
return orderSnap.val();
});
listOfOrderPromises.push(thisOrderPromise); // append this promise to a list of promises (one for each order)
}
return Promise.all(listOfOrderPromises); // resolve all of the promises: generates your expected `orderList`
})
.then((orderList)=>{ // commit the orders from the resolved order List
commit("setUserOrders", orderList);
})
}
请注意 Promise.all()
函数接受一组 promise (例如,[promise_1, promise_2, ...]
)并使用从每个单独的 promise 中解析的值数组进行解析(例如,[result_of_promise_1, result_of_promise_2 , ...]
)
关于javascript - 从 for 循环内部插入数组 - 在 promises 内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49863360/