javascript - 从 for 循环内部插入数组 - 在 promises 内部

标签 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();
        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/

相关文章:

javascript - 新的子元素包含父元素

javascript - 迭代匹配元素来控制自定义光滑轮播

javascript - 替换功能只能使用一次(javascript)

node.js - 使用 Cloud Functions 从 onCreate 触发器检索 Firestore 文档

ios - 将错误的图片上传到我的 Firebase 存储

javascript - Firebase 存储 downloadURL 的 url 字符串中包含 "v0"

swift - 与 Firebase 用户的电话联系

javascript - React 显示嵌套数组项

javascript - 在代码示例中无法理解 this 的上下文

android - 在 Firebase DB 中输入的字符串值中的空格给出未终止的字符串错误 android