Асинхронный запрос внутри двух Array.maps - PullRequest
1 голос
/ 25 марта 2019

Я создаю API для взаимодействия с моей базой данных Google Cloud Firestore.Я запрашиваю «конвейеры» в моем приложении.Запрос вернет массив конвейеров (т.е. массив объектов JSON).Каждый объект JSON имеет атрибут users , который равен массиву строк .Каждая строка представляет идентификатор пользователя в моей базе данных.

Что я пытаюсь сделать, так это сопоставить каждый конвейер и затем внутри каждой конвейерной карты массив пользователей, чтобы сделать асинхронный вызов моегобаза данных для извлечения информации для этого пользователя по его идентификатору пользователя.

У меня возникли проблемы с ожиданием завершения всех асинхронных запросов и правильного возврата данных.В настоящее время у меня есть следующий код:

pipelineResults.map(pipeline => {


    pipeline.users = pipeline.users.map(user => {
        return promises.push(db.collection('users')
            .doc(user)
            .get()
            .then(snapshot => {
                user = snapshot.data();
                console.log(user);
                return user;
            }));
    });

    return pipeline;

});

Promise.all(promises)
    .then(result => {
        res.send(pipelineResults);
    });

pipelineResults JSON определяется следующим образом (перед сопоставлением):

[
{
    "integrations": [
        {
            "dateAdded": {
                "_seconds": 1553435585,
                "_nanoseconds": 769000000
            },
            "vendorId": "abcdefg",
            "integrationId": "ahdhfyer",
            "addedBy": "xEcscnBo0PGgOEwb2LGj",
            "used": 1
        }
    ],
    "users": [
        "xEcscnBo0PGgOEwb2LGj"
    ],
    "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nec augue dapibus, interdum felis ac, tristique nunc. Donec justo ex, pulvinar a nisl et, consequat porta nunc.",
    "scheduled": {
        "isScheduled": false
    },
    "orgId": "ae35gt654",
    "runInfo": null,
    "name": "Development pipeline",
    "teams": [
        {
            "users": [
                "xEcscnBo0PGgOEwb2LGj"
            ],
            "createdOn": {
                "_seconds": 1553435585,
                "_nanoseconds": 769000000
            },
            "id": "abfe4h6uuy",
            "createdBy": "xEcscnBo0PGgOEwb2LGj",
            "userCount": 1
        }
    ],
    "createdOn": {
        "_seconds": 1553435585,
        "_nanoseconds": 769000000
    },
    "createdBy": "xEcscnBo0PGgOEwb2LGj"
}
]

После выполнения вышеуказанного кодаЧтобы отобразить конвейеры и пользователей, пользовательский атрибут в конвейере теперь представляет собой просто массив с 1 внутри:

"users": [
        1
]

Пользовательский объект должен выглядеть следующим образом:

{ firstName: 'Alex',
  activeIntegrations: 14,
  position: 'Manager',
  email: 'alex@alexwiley.co.uk',
  lastName: 'Wiley',
}

Я почти уверен, что не возвращаюсь и не жду асинхронного вызова.

Сводка Выполнение асинхронного вызова внутри двух функций карты.

Любая помощь очень ценится.

1 Ответ

1 голос
/ 25 марта 2019

Вы пытаетесь назначить pipe.users, пока обещание не выполнено; попробуйте это:

Попробуйте это:

return Promise.all(pipelineResults.map(pipeline => {
    return Promise.all(pipeline.users.map(user => 
        db.collection('users')
            .doc(user)
            .get()
            .then(snapshot => {
                user = snapshot.data();
                console.log(user);
                return user;
            });
    ))
    .then(users => {
       pipeline.users = users;
    });    
}))
.then(() => res.send(pipelineResults));
...