Node JS Возвращение без выполнения обещаний - PullRequest
1 голос
/ 27 марта 2020

Я надеюсь, что это простые вопросы, и я просто пропустил что-то простое. У меня есть цепочка обещаний, возвращающих функции, которые выполняются с использованием .then (). Моя последняя функция берет данные, которые я возвращаю, и форматирует в правильный формат, который затем передается обратно клиенту. Проблема, с которой я столкнулся (я думаю), заключается в том, что сервер отправляет клиенту переменную ff до того, как обещание от функции форматирования будет решено. Что меня смущает, так это то, что когда я регистрирую переменную ff, она регистрирует все данные, как и ожидалось.

Любые мысли о том, почему это происходит, что я делаю неправильно, и самое главное, как решить эту проблему ?

app.get("/subData", function(req, res) {
    getConnection().then(function() {
        return getSQL();
    }).then(function(sql) {
        return executeQuery(sql);
    }).then(function(data) {
        return formatData(data);
    }).then(function(ff) {
        console.log(ff);
        res.status(200).send(ff);
    }).catch(function(err) {
        console.log("ERR:");
        console.log(err);
        res.status(405).send(err);
    });    
});

Вот функция окончательного формата данных:

function formatData(data) {
    var finArr = Array();

    return new Promise(function(resolve, reject) {
        data.rows.forEach(function(row, fin) {
            var tempArr = Array();

            row.forEach(function(itm, pos) {
                var ttl = data.metaData[pos].name;
                var val = itm;

                tempArr[ttl] = val;
            });

            finArr.push(tempArr);

            if(fin + 1 == data.rows.length) {
                resolve(finArr);
            }            
        });
    });
}

Ответы [ 2 ]

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

Довольно ясно, что одно из ваших обещаний не выполняется. Зачем делать вызов resolve() в вашем методе formatData() условным? Почему бы просто не позволить l oop закончиться?

function formatData(data) {
    var finArr = Array();

    return new Promise(function(resolve, reject) {
        data.rows.forEach(function(row, fin) {
            var tempArr = Array();

            row.forEach(function(itm, pos) {
                var ttl = data.metaData[pos].name;
                var val = itm;

                tempArr[ttl] = val;
            });

            finArr.push(tempArr);    
        });
        resolve (finArr);
    });
}

Действительно, здесь вам вообще не нужен Promise, потому что это синхронная операция. И можно использовать синхронные операции в цепочках .next(). Вот так.

function formatData(data) {
    var finArr = Array();

    data.rows.forEach(function(row, fin) {
        var tempArr = Array();
        row.forEach(function(itm, pos) {
            var ttl = data.metaData[pos].name;
            var val = itm;
            tempArr[ttl] = val;
        });
        finArr.push(tempArr);    
    });
    return finArr;
}
0 голосов
/ 31 марта 2020

Проблема не имеет ничего общего с правильными решениями обещаний. Проблема заключалась в том, как я форматировал свои данные для отправки обратно клиенту. Я строил массив ассоциативных массивов с помощью следующего кода. Когда он отправлялся клиенту, он отправлялся как пустой массив массивов.

data.rows.forEach(function(row, fin) {
        var tempArr = Array();
        row.forEach(function(itm, pos) {
            var ttl = data.metaData[pos].name;
            var val = itm;
            tempArr[ttl] = val;
        });
        finArr.push(tempArr);    
    });
    return finArr;

Мне нужно было отправить данные в виде массива объектов, а затем преобразовать их в массив массивы на стороне клиента. Приспосабливая мой код к этому, данные должным образом передавались по мере необходимости.

data.rows.forEach(function(row, fin) {
    // Change From var tempArr = Array() to var tempArr = {} to initialize new Object
    var tempArr = {};

    row.forEach(function(itm, pos) {
        var ttl = data.metaData[pos].name;
        var val = itm;

        tempArr[ttl] = val;
    });
    finArr.push(tempArr);    
});
return finArr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...