在我的项目中,我从firebase获取订单ID,然后根据该ID获取每个订单 最后想把这个订单推到我的orderList数组。
但是orderList数组总是为空的,我认为在for循环中将值推入数组时会出现问题,但无法找到解决方案。
如何修复此问题并将值推送到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++;
}
});
},
编辑:我找到了一个解决方案,但它有点脏。我认为可能有更好的解决方案
employee_id
答案 0 :(得分:1)
(免责声明:我不是Firebase用户,但假设它以我习惯的方式使用JavaScript Promises(Promise<T>
),那么这样的事情就可以了。
请注意使用Promise.all
,以便在将已解析的值传递到firebase.database()...
之前等待所有commit( "setUserOrders", ... )
次调用/承诺完成。
service
.fetchUserOrdersIds( getters.user.id )
.then( snapshot => {
var tempOrderIds = snapshot.val();
var size = Object.keys( tempOrderIds ).length;
var i = 0;
var promises = tempOrderIds
.map( orderId => firebase
.database()
.ref( "orders" )
.child( orderId )
.once( "value" )
);
Promise
.all( promises )
.then( orderValues => {
orderValues = orderValues.map( e => e.val() );
commit( "setUserOrders", orderValues );
} );
}
答案 1 :(得分:1)
您的commit()
函数收到空orderList
因为它已在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_1, promise_2, ...]
请注意promise
函数接受一组promise(例如[result_of_promise_1, result_of_promise_2, ...]
)并使用从每个单独的promise(例如{{1}})<解析的值的数组进行解析/ p>