Как обновить массив данных в базе данных с помощью NodeJs Async? - PullRequest
0 голосов
/ 17 февраля 2019

Я новичок в NodeJ и нахожу неблокирующую и асинхронную природу JS чрезвычайно трудной для понимания и обработки,
У меня есть фрагмент кода, который должен повторять массив
и для каждогоитерация, я должен сделать обновление БД.

Может ли кто-нибудь предоставить правильную реализацию функций библиотеки Async и помочь исправить мой код?

Пример кода -

function updateFunction(conn, requestBody, callback) {

    let arr = [];

    async.each(requestBody.arr, function(item, callback) {
        let sqlData = []
        let columns = "";

        if(item.columnData != null){
            sqlData.push(item.columnData);
            columns += "`columnName` = ?,";
        }

        if(columns != ''){
            columns = columns.substring(0,columns.length-1);

            let sqlQuery = 'UPDATE someTable SET '+columns
            +' WHERE id = "' + item.id + '"';

            conn.query(sqlQuery, sqlData, function (err, result) {
                if (err) {
                    return callback(err, false);
                }
            })
        }
        else{
            return callback(null, false);
        }
        columns = "";
        sqlData = [];
    },
    function(err, results) {
    //Code never reaches here, don't know why       
     if (err) {
            return callback(err, false);
        }
        else{
           return callback(null, true);
        }
    });
} // END 

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Во время вашего запроса к базе данных, при успешном запросе ваш обратный вызов не вызывается, поэтому ваш код никогда не достигнет окончательного обратного вызова.

Вы захотите добавить еще один оператор возврата после if (err) { return callback(err); }, чтобы асинхронно знал, что ваш запрос к базе данных завершен.

И еще одна вещь, в соответствии с документами, асинхронный обратный вызов каждого метода не вызывается с результатами в обратном вызове.

Обратный вызов, который вызывается, когда все функции iteratee завершены или возникает ошибка.Вызывается с помощью (err).

Следовательно, вам не нужно передавать значение в оператор обратного вызова в вашей функции iteratee.

Измените код, чтобы сделать это, и этобудет работать.

conn.query(sqlQuery, sqlData, function (err, result) {
    if (err) {
        return callback(err);
    }

    return callback(null);
})

Надеюсь, это поможет.

0 голосов
/ 17 февраля 2019
conn.query(sqlQuery, sqlData, async function (err, result) {
                if (err) {
                    return  await callback(err, false);
                }
            })

Как-то так ... поэтому функция обратного вызова здесь async, и мы дали await, которая фактически ждет, пока обратный вызов не завершится ..

...