handsome
handsome

Reputation: 2402

How to use a promise inside a promise?

I´m trying to generate a pseudo XML with car brands and models. but I´m getting an error in

ReferenceError: models is not defined. is that because is a promise? what´s the correct way to do this? thank you

const output = () => {

    const id = 1

    brand(id)
        .then((brand) => {
            const models = models(brand.id)

            let xml = '<brand>';
            models.map((model) => {
                xml += '<brand>' + model.name + '</brand>';
            });
            xml += '</brand>';
            return response.send(xml);
        })
});

const brand = (id) => {
    return database
        .collection("brands")
        .doc(id)
        .get();
};

const models = (brandId) => {
    return database
        .collection("brands")
        .doc(brandId)
        .collection("models")
        .get();
};

Upvotes: 0

Views: 55

Answers (3)

Soc
Soc

Reputation: 7780

You need to also resolve the models promise. I'd also rename your methods to avoid conflicting names. See example:

const output = () => {

    const id = 1

    getBrand(id)
        .then((brand) => {
            return getModels(brand.id)
                .then(modules => {
                    let xml = '<brand>';
                    models.map((model) => {
                        xml += '<brand>' + model.name + '</brand>';
                    });
                    xml += '</brand>';
                    return response.send(xml);
                });

        })
});

const getBrand = (id) => {
    return database
        .collection("brands")
        .doc(id)
        .get();
};

const getModels = (brandId) => {
    return database
        .collection("brands")
        .doc(brandId)
        .collection("models")
        .get();
};

Upvotes: 1

BravoZulu
BravoZulu

Reputation: 1140

There are a couple of issues. First, you are using models before it's defined, which will cause a problem. Second, models is indeed a promise, so you can't assign it to a variable directly. I suggest using async/await for this:

const brand = (id) => {
    return database
        .collection("brands")
        .doc(id)
        .get();
};

const models = (brandId) => {
    return database
        .collection("brands")
        .doc(brandId)
        .collection("models")
        .get();
};
const output = async () => {

    const id = 1

    const brand = await brand(id);
        
    const models = await models(brand.id)

     let xml = '<brand>';
     models.map((model) => { xml += '<brand>' + model.name + '</brand>'; });
     xml += '</brand>';
     return response.send(xml);
});


Also, response is not defined here, but I'm guessing you have it somewhere else. Otherwise this too will fail

Upvotes: 2

Giovanni Esposito
Giovanni Esposito

Reputation: 11156

Ciao, you should call .then also for models like:

const output = () => {

const id = 1

brand(id)
    .then((brand) => {
        models(brand.id)
           .then((models) => {
              let xml = '<brand>';
              models.map((model) => {
                 xml += '<brand>' + model.name + '</brand>';
              });
              xml += '</brand>';
              return response.send(xml);
        })           
    })
});

Upvotes: 0

Related Questions