He intentado algunos métodos y he estado leyendo todo el tiempo, pero parece que no puedo entender cómo devolver la matriz de nombres de esta función.

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;
        });
    });
}
0
girlcoder 8 mar. 2017 a las 22:04

2 respuestas

La mejor respuesta

No estoy seguro de qué biblioteca de Promise está utilizando, ya que parece no estándar, pero creo que algo como esto es lo que quiere. Agregué comentarios sobre lo que está sucediendo: es posible que deba cambiar esas líneas de código para adaptarlas a su biblioteca de promesas.

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);
}
1
Ryan Wheale 8 mar. 2017 a las 19:41

Simplemente agregue

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

Eso hace que la promesa devuelta se cumpla con la matriz names.

Sin embargo, recomendaría que no utilice una matriz global en el bucle each, especialmente si le importa el orden de los resultados. En cambio, resuelva cada promesa con un valor, use map en lugar de each, y combine los resultados al final:

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)
    );
}
1
Bergi 8 mar. 2017 a las 19:28