Javascript не толкает объект в массив должным образом - PullRequest
0 голосов
/ 16 октября 2019

В настоящее время я работаю над приложением для платья, и я столкнулся с проблемой, которая стоила мне дней, множественного кофе и царапин на голове!

По сути, я пытаюсь вернуть массив всехданные профиля владельцев платья.

Итак, получается:

getDressData () => {
- Хранить детали платья
- Хранить платье владельца
},

getOwnerData () => {
- просмотр всех владельцев платья
- получение данных их профиля
},

resol () => {
- возврат платья ифильтровать данные
- возвращать данные профиля владельца платья
}


Вот код:

    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
            });
        });
    });

Вот что он возвращает:

Что возвращает Обещание

Как видно из изображенияоба массива возвращают правильные данные. Однако, если вы посмотрите на первый массив, он отображает '[]', а второй '(4) [{…}, {…}, {…}, {…}]'.

I 'Я пытаюсь получить первый массив для возврата, как второй массив.

Проблема в том, что я не могу получить данные из первого массива. Массив платьев (2-й) Я могу получить платье [я]. Цвет и т. Д.

Что я делаю не так? Это способ разрешения массивов или проблема со структурой кода .then ()?

1 Ответ

0 голосов
/ 16 октября 2019

Если я не ошибаюсь, если вы ничего не возвращаете из .then в цепочке, то .then разрешаются немедленно, поскольку они на самом деле ничего не ожидают с помощью явного возврата. Попробуйте вернуть dressOwners из первого .then и использовать переданные данные в следующем .then

Затем в следующем .then, где вы создаете несколько обещаний в цикле for, соберите эти обещания вмассив и вернуть результат Promis.all (myPromiseArray), чтобы добраться до финала .then в правильном порядке.

...