Вопрос:

как я могу вернуть массив из этого обещания?

javascript bluebird es6-promise

54 просмотра

2 ответа

125 Репутация автора

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

function getNames(oauth2Client, docs) {
const api = x('v1');

let names = [];

return Promise.each(docs, function(doc) {
        let req = api.users.messages.get;

        let options = ({
            auth: oauth2Client,
            'userId': 'me',
            'id': doc.id
        });

        return Promise.promisify(req)(options).then(function(response) {
            for (y = 0; y < response.names.length; y++) {              
                names.push(response.names[y].toLowerCase());                
            }
        })
        .catch(function (err) {
            console.log('An error occured: ' + err.message);
            throw err;
        });
    });
}
Автор: girlcoder Источник Размещён: 08.03.2017 07:04

Ответы (2)


1 плюс

13742 Репутация автора

Решение

Я не уверен, какую библиотеку Promise вы используете, поскольку она выглядит нестандартной, но я думаю, что-то вроде этого вам нужно. Я добавил комментарии о том, что происходит - возможно, вам придется изменить эти строки кода в соответствии с вашей библиотекой обещаний.

function getNames(oauth2Client, docs) {
    const api = x('v1');
    const names = [];
    // create a stack of promises
    const stack = [];
    docs.forEach(doc => {
        let req = api.users.messages.get;
        let options = ({
            auth: oauth2Client,
            'userId': 'me',
            'id': doc.id
        });
        // push each promise onto the stack
        stack.push(
            Promise.promisify(req)(options).then(function(response) {
                for (y = 0; y < response.names.length; y++) {              
                    names.push(response.names[y].toLowerCase());                
                }
            })
            .catch(function (err) {
                console.log('An error occured: ' + err.message);
                throw err;
            })
        );
    });
    // Wait for all promises in the stack to finish, and then
    // return the names array as the final value.
    return Promise.all(stack).then(() => names);
}
Автор: Ryan Wheale Размещён: 08.03.2017 07:14

1 плюс

404736 Репутация автора

Просто добавь

return Promise.each(…)
.then(function() {
    return names;
});

это заставляет возвращенное обещание выполнить namesмассив.

Однако я бы порекомендовал вам не использовать глобальный массив в eachцикле, особенно если вы заботитесь о порядке результатов. Вместо этого разрешите каждое обещание значением, используйте mapвместо него eachи объедините результаты в конце:

const api = x('v1');
const getUserMessages = Promise.promisify(api.users.messages.get);

function getNames(oauth2Client, docs) {
    return Promise.map(docs, doc =>
        getUserMessages({
            auth: oauth2Client,
            'userId': 'me',
            'id': doc.id
        })
        .then(response =>
            response.names.map(name => name.toLowerCase());
        )
    )
    .then(nameArrays =>
        [].concat(...nameArrays)
    );
}
Автор: Bergi Размещён: 08.03.2017 07:21
Вопросы из категории :
32x32