Как я могу передать объект или переменную вместе с Promise.all? - PullRequest
0 голосов
/ 11 февраля 2020

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

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 ]

2 голосов
/ 11 февраля 2020

Если вы хотите получить массив, если объекты содержат id и balance, вы можете сделать что-то подобное. Вы вызываете client.getBalance(), и в обработчике .then() вы создаете нужный объект в результате, который объединяет 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);
});

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

1 голос
/ 11 февраля 2020

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...