вставить оператор в nodejs для цикла? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь вставить несколько значений в базу данных nosql cassandra, используя массив, но когда я использую приведенный ниже код, вместо добавления строки для каждого из значений, хранящихся в foo5, заканчивается только добавление двух строк,Две добавленные строки содержат одинаковые значения в col5 и col3

var insert2 = "INSERT INTO content (col, col2, col3, col4, col5) VALUES (?, ?, ?, ?, ?);"
    for(var i = 0; i < foo5.length; i++) {
        client.execute(insert2, [foo, foo2, foo3, foo4, foo5[i]], {prepare : true}, function(err, result) {
            if(err) throw err;
        });
    }

, например, вот как выглядит результат (col является первичным ключом):

 col     | col2    | col3      | col4   | col5
---------+---------+-----------+--------+--------
 8909265 |  text   |      8759 |   5332 |   7480
 1769288 |  text   |      8759 |   5332 |   7480

Я хочу добавить строку для каждого отдельного значения в массиве foo5.Это ожидаемый результат.Как я могу добиться этого:

 col     | col2    | col3     | col4  | col5
---------+---------+-----------+--------+--------
 8909265 |  text   |      8759 |   5332 |   1234
 1769288 |  text   |      8759 |   5332 |   5678
 3254786 |  text   |      8759 |   5332 |   9101112
 4357234 |  text   |      8759 |   5332 |   1314151617

при условии foo5 = {1234, 5678, 9101112, 1314151617};

ОБНОВЛЕНИЕ:

после добавления рекурсивной функции, как предложено someRandomSerbianGuy этокак выглядит мой код:

function recursion(i, counter) {
    var insert2 = "INSERT INTO content (col, col2, col3, col4, col5) VALUES (?, ?, ?, ?, ?);"
    if(counter == i) {
        return;
    } else {
        client.execute(insert2, [foo, foo2, foo3, foo4, foo5[i]], {prepare : true}, function(err, result) {
            if(err) throw err;
            recursion(++i, counter);
        });
    }
}
recursion(0, foo5.length);

Я все еще получаю те же результаты.

Ответы [ 2 ]

0 голосов
/ 17 июня 2018

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

Код будет проще, и он будет работать более простым способом, с однимвставьте за раз:

async function insert(sql, data) {
  for (let i=0; i<data.length; i++)
    await client.insert(sql, data[i]);
}
0 голосов
/ 02 июня 2018

Это потому, что Node.js асинхронный.Вы можете использовать Promises для этого или рекурсивную функцию вместо цикла.

Используя рекурсивную функцию вместо цикла, вы даете ему возможность завершить client.execute и затем запускаете его снова с другими данными.Используя цикл for, вы просто вызываете client.execute несколько раз с одними и теми же данными.

Пример (для рекурсии в Node.js учтите, что есть лучшие способы написать это, но я хотел сделать этопросто, чтобы вы могли понять синтаксис):

function recursion(i, howManyTimes){ //First you define function
    if(i === howManyTimes){ //If it's called enough times just escape recursion
        return;
    }else{
        //Your code for DB should be here, after successful .execute call call line under this one!
        recursion(++i, howManyTimes);
    }
}
recursion(0, 5); //You can call your function now since you defined it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...