Andy Mendez
Andy Mendez

Reputation: 25

My promise is being resolved before my second query is able to run inside of a .map function

       const getAdditionalInfosPromise = (ProgramID, LeadId) => {
        return new Promise((resolve, reject) => {
            connection.query(`SELECT * FROM crm_additionalLeadInfoFields WHERE ProgramID= ${ProgramID};`, (error, response) => {
                if (error) reject(console.error(error, 'SQL ERROR IN GETADDITIONALINFOPROMISE'));
                else {
                    let getAdditionalInfosData = [];
                    const getAdditionalInfos = response;
                    getAdditionalInfos.map((data, i) => {
​
                        let tableNameData;
                        // checking to see what our table name is 
                        if (data.TableName === 'leads') {
                            tableNameData = `WHERE id= ${LeadId};`
                        }
                        else {
                            tableNameData = `Where LeadId = ${LeadId};`
                        }
​
                        // Remove any white spaces
​
                        const columnName = data.ColumnName.replace(/ +/g, "")
​
                        connection.query(`SELECT ${columnName} as pertinentValue 
                        FROM ${data.TableName}
                        ${tableNameData}`, (err, res) => {
                            if (err) console.error(err, 'MY SQL ERR IN GETADDITIONALINFOSPROMISE');
                            else {
                                console.log(data);

                                if (data.DisplayName !== 'Dealer Name') {
                                    const pertinentValue = res[0].pertinentValue
​
                                    getAdditionalInfosData.push({
                                        'id': `additionalItem${i}`,
                                        'label': data.DisplayName,
                                        'value': `${pertinentValue !== null ? pertinentValue : ''}`,
                                        'class': ''
                                    })
​
                                }
                            }
                        })

                    })

                    resolve(getAdditionalInfosData)
                }
            })
​
        })
    }

Any Idea how to make this asynchronous? I tried using the async npm package but was having issue with getting any type of response back from the async.map(array, function (result,callback) {// Was null here} ). As it is right now it is returning an empty object and then logging my data afterwards Thanks to all who help! :)

Upvotes: 1

Views: 26

Answers (1)

lloan
lloan

Reputation: 1403

Have you tried converting the items in the array you're mapping into promises? Then, using something like Promise.all (see below)? I also went ahead and moved a few items around to make it easier for me to read.

const getAdditionalInfosPromise = (ProgramID, LeadId) => {
    return new Promise((resolve, reject) => {
        connection.query(`SELECT * FROM crm_additionalLeadInfoFields WHERE ProgramID= ${ProgramID};`, (error, response) => {
            if (error) reject(console.error(error, 'SQL ERROR IN GETADDITIONALINFOPROMISE'));

            let getAdditionalInfosData = [];
            const getAdditionalInfos = response;

            const allPromises = getAdditionalInfos.map((data, i) => { 
                if (data.DisplayName !== 'Dealer Name') {
                    const tableNameData = data.TableName === 'leads' ? `WHERE id= ${LeadId};` : `Where LeadId = ${LeadId};`;
                    const columnName = data.ColumnName.replace(/ +/g, "")​

                    return new Promise((resolve, reject) => {
                        connection.query(`SELECT ${columnName} as pertinentValue FROM ${data.TableName} ${tableNameData}`, (err, res) => {
                            if (err) console.error(err, 'MY SQL ERR IN GETADDITIONALINFOSPROMISE');

                            console.log('within the select query', data);


                            const pertinentValue = res[0].pertinentValue​
                            resolve({
                                'id': `additionalItem${i}`,
                                'label': data.DisplayName,
                                'value': `${pertinentValue !== null ? pertinentValue : ''}`,
                                'class': ''
                            })​


                        })
                    })
                }

                reject({});
            });

            console.log(allPromises)

            resolve(getAdditionalInfosData)

        })​
    })
}

Then you can do something like:

Promise.all(allPromises).then(function(values) {
  console.log(values);
  // do anything you need with your data here
}); 

Upvotes: 1

Related Questions