Как я могу передать объект или переменную вместе с Promise.all?

У меня возникла проблема, когда я хочу отправить в Plaid несколько запросов с просьбой предоставить информацию об учетной записи, но когда она возвращается, я не знаю, где связать информацию об учетной записи, поэтому мне нужно передать идентификатор, например source.id . Проблема в Promise.all не работает так, как я написал ниже. Есть ли другой способ сделать это, чтобы я мог вернуть нужное мне удостоверение личности?

var userSources = firestore.collection('sources');
    userSources.get().then(snapshot => {
        snapshot.forEach(doc => {
            var source = doc.data();
            sources.push(source);
        });
    return sources;

    }).then((sources) => {
        // 2: Connect to Plaid and query accounts
        var promises = [];
        sources.forEach(function(source) {
            promises.push({
                id: source.id,
                p: client.getBalance(source.access_token)
            });
        });
        return Promise.all(promises);

    }).then...
    ```

Всего 2 ответа


Если вы хотите получить массив, если объекты имеют id и balance в них, вы можете сделать что-то вроде этого. Вы вызываете client.getBalance() и в обработчике .then() создаете source.id объект в результате, который комбинирует source.id с balance и вы возвращаете его в качестве разрешенного значения из обещания. Затем вы можете запустить Promise.all() для этого массива обещаний и в результате получить соответствующий массив объектов.

let userSources = firestore.collection('sources');
userSources.get().then(snapshot => {
    return Promise.all(snapshot.map(doc => {
        let source = doc.data();
        return client.getBalance(source.access_token).then(balance => {
            return {id: source.id, balance: balance};
        });
    }));
}).then(results => {
    // array of {id, balance} objects
    console.log(results);
});

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


Вместо этого я хотел бы использовать await , чтобы массив sources текстов создавался в верхней части кода, но все еще виден всем, что находится под ним. Убедитесь, что содержащая функция асинхронная, а затем:

const snapshot = await firestore.collection('sources').get();
const sources = snapshot.docs.map(doc => doc.data());
const promises = sources.map(source => client.getBalance(source.access_token));
const results = await Promise.all(promises);
// now, results[i] will correspond to sources[i].id

Обратите внимание, что вы можете использовать .map для преобразования одного массива в другой, что немного более уместно, чем forEach .


Есть идеи?

10000