从for循环内部推入数组 - 承诺内部

时间:2018-04-16 17:47:12

标签: javascript firebase firebase-realtime-database promise es6-promise

在我的项目中,我从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

2 个答案:

答案 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>