2015-11-12 2 views
1

У меня возникли трудности с циклом for с петлями с запросами (knexjs.org). Начнем с того, как я повторяю свой массив. Мой массив выглядит следующим образом:NodeJS повторяется слишком быстро с knex

[ { module_id: 9, able: '1', will: '1' }, 
{ module_id: 9, able: '1', will: '1' }, 
{ module_id: 2, able: '1', will: '1' }, 
{ module_id: 2, able: '1', will: '1' }, 
{ module_id: 4, able: '1', will: '1' }, 
{ module_id: 4, able: '1', will: '1' }, 
{ module_id: 1, able: '1', will: '1' }, 
{ module_id: 1, able: '1', will: '1' }, 
{ module_id: 8, able: '1', will: '1' }, 
{ module_id: 8, able: '1', will: '1' }, 
{ module_id: 7, able: '1', will: '1' }, 
{ module_id: 7, able: '1', will: '1' }, 
{ module_id: 5, able: '1', will: '1' }, 
{ module_id: 5, able: '1', will: '1' }, 
{ module_id: 3, able: '1', will: '1' }, 
{ module_id: 3, able: '1', will: '1' }, 
{ module_id: 6, able: '1', will: '1' }, 
{ module_id: 6, able: '1', will: '1' } ] 

Тогда "весело" часть приходит:

for(var i = 0; i < obj.length; i++) { 
     var object = obj[i]; 
     console.log("has object", object); 
     db.knex('interests').where({ 
      inventory_id: inventory_id, 
      module_id: object.module_id 
     }).select().limit(1).then(function (result) { 
      console.log("MODULE ID", object.module_id); 
      if (result.length == 0) { 

       db.knex('interests').insert({ 
        inventory_id: inventory_id, 
        module_id: object.module_id, 
        could: object.able, 
        would: object.will 
       }).then(function (a) { 
       }); 
      } else { 
       db.knex('interests').where({ 
        inventory_id: inventory_id, 
        module_id: object.module_id 
       }).update({ 
        could: object.able, 
        would: object.will 
       }).then(function (a) { 
       }); 
      } 
     }); 
    } 

Что делает код выглядит следующим образом:

  • Итерация через массив
  • запросов база данных
  • Если нет результатов, то создайте что-нибудь
  • Если результаты, обновите что-нибудь

Есть только одна проблема. Для петли тоже быстро. Или, другими словами: запрос слишком медленный. Зачем? Потому что object.module_id всегда является последним module_id из массива.

Как я могу убедиться, что он использует module_id из цикла for, а не переменной, которую он дал в последний раз, когда он был итерирован?

ответ

1

Собственно, его не тот Узел слишком быстрый. Это потому, что запросы работают асинхронно.

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

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

var queryinterest = function(object){ 
     db.knex('interests').where({ 
     inventory_id: inventory_id, 
     module_id: object.module_id 
    }).select().limit(1).then(function (result) { 
     if (result.length == 0) { 
       insertInterest(object) 
     } else { 
       updateInterest(object)    
    }) 
} 

, призвав их в главном цикле.

for(var i = 0; i < obj.length; i++) { 
     queryInterests(obj[i]) 
     }); 
    } 

EDIT: Это сообщение является большим для уточнения того, почему и как работать асинхронно:

Nodejs asynchronous confusion

+0

Мы почти там, спасибо за вашу помощь до сих пор ... пока, в queryinterest, 'return q_result' возвращает undefined, потому что запрос еще не закончен ... как это исправить? – Thijmen

+0

whoops Я думаю, что я сделал опечатку 'q_restult' вместо' q_result', я редактировал мой код! –

+0

Это тоже не работает. Возврат 'q_result' достигается до того, как' q_result = result' – Thijmen

Смежные вопросы