Мое обещание выполняется до того, как мой второй запрос может быть запущен внутри функции .map - PullRequest
1 голос
/ 30 марта 2020
       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)
                }
            })
​
        })
    }

Есть идеи, как сделать это асинхронным? Я попытался использовать пакет asyn c npm, но у меня возникла проблема с получением ответа любого типа от async.map(array, function (result,callback) {// Was null here} ). Как сейчас, он возвращает пустой объект, а затем регистрирует мои данные. Спасибо всем, кто помог! :)

1 Ответ

1 голос
/ 30 марта 2020

Вы пытались преобразовать элементы в массиве, который вы отображаете, в обещания? Затем, используя что-то вроде Promise.all (см. Ниже)? Я также пошел вперед и переместил несколько предметов, чтобы мне было легче читать.

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)

        })​
    })
}

Тогда вы можете сделать что-то вроде:

Promise.all(allPromises).then(function(values) {
  console.log(values);
  // do anything you need with your data here
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...