Javascript无法将对象正确推送到数组

时间:2019-10-16 13:14:56

标签: javascript firebase promise google-cloud-firestore

我目前正在着装应用程序上,遇到了一个问题,该问题使我花费了很多时间,多杯咖啡和头部刮擦!

基本上,我正在尝试返回所有礼服所有者个人资料数据的数组。

它是如此:

getDressData()=> {   
-商店着装细节   
-服装店老板
},

getOwnerData()=> {   
-遍历所有服装所有者   
-获取他们的个人资料
},

resolve()=> {   
-返回着装和过滤数据   
-返回礼服所有者的个人资料数据
}


这是代码:

    return new Promise((resolve, reject) => {
        var db = firebase.firestore();
        var dresses = [];
        var filters = [];
        var dressOwners = [];
        var ownerData = [];

        var dressCollection = db.collection('dresses');
        var ownerCollection = db.collection('account');
        var dressesRef = dressCollection.orderBy("date", "desc");
        
        dressesRef.get()
        .then(function(doc) {       
            if (!doc.empty) {
                doc.docs.forEach(function(doc) {
                    if (doc.exists) {
                        var item = doc.data();
                        dresses.push({
                            'dressId' : doc.id,
                            'colour' : item.colour,
                            'credit' : item.credit,
                            'date' : item.date,
                            'description' : item.description,
                            'images' : item.images,
                            'owner' : item.owner,
                            'size' : item.size
                        });

                        if(filters.filter(x => x.size == item.size).length == 0) {
                            filters.push({"size" : item.size, "colours": [item.colour]});
                        } 
                        else {
                            var index = filters.findIndex((x => x.size == item.size));
                            
                            if (!filters[index].colours.filter(x => x.colours == item.colour).length > 0) {
                                filters[index].colours.push(item.colour);
                            }
                        }

                        if (dressOwners.indexOf(item.owner) === -1) {
                            dressOwners.push(item.owner);
                        }
                    }
                });
            }
        })
        .then(function(){
            for (let i = 0; i < dressOwners.length; i++) {
                ownerCollection.doc(dressOwners[i]).get()
                .then(function(doc){
                    if (doc.exists) {
                        item = doc.data();
                        ownerData.push({                               
                            'uid' : doc.id,
                            'displayName' : item.displayName,
                            'feedback_neg' : item.feedback_neg,
                            'feedback_pos' : item.feedback_pos,
                            'registerDate' : item.registerDate,
                            'address' : item.address,
                            'email' : item.email
                        });
                    }
                });
            }
        })
        .then(function(){
            resolve({
                "dresses" : dresses,
                "ownerData" : ownerData,
                "filters" : filters
            });
        });
    });

这是它返回的内容:

What the Promise returns

从图像中可以看到,两个数组都返回正确的数据。但是,如果您查看第一个数组,它将显示'[]',第二个数组将显示'(4)[{…},{…},{…},{…}]'。

我试图让第一个数组像第二个数组一样返回。

问题是我无法从第一个数组获取数据。衣服阵列(第二个),我可以得到dress [i] .colour等

我在做什么错?是我解析数组的方式,还是代码的.then()结构有问题?

1 个答案:

答案 0 :(得分:-1)

如果我没记错的话,如果您不从.then链中返回任何内容,那么.thens会立即解析,因为它们实际上并没有通过显式返回实际等待任何内容。尝试从第一个.then返回dressOwner,然后在下面的.then

中使用传入的数据

然后,在下面的.then中,在for循环中创建多个promise,将这些promise收集到数组中,然后以正确的顺序返回Promis.all(myPromiseArray)的结果以到达最终的.then