2015-12-25 3 views
3

У меня есть этот фрагмент, который подсчитывает число строк и возвращает количество строк, найденных в таблице MySQL. Это код, в котором я использовал underscore.js _.each для итерации.Замена _.each в функции

var all_rows = Noder.query('SELECT count(*) as erow from crud ', function(err, the_rows) { 

      _.each(the_rows, function (corndog) { 
      var trows = corndog.erow; 
      console.log("All rows", trows); 
      }); 

      // var das_rows = trows; 
      // var total_pages = Math.ceil(das_rows/per_page); 
      // console.log("Pages",total_pages); 

     res.view('noder/orm', { 
      layout: 'layout', 
      js:the_rows, 
      post:results, 
      title: 'This is the hi page title. Gandalf The great.' 
     }); 
     }); 

Я хочу использовать trows для вычисления количества страниц, должны быть созданы для моего персонального вызова кода. Однако я не могу получить доступ к переменной trows.

Это выход console.log(the_rows);

[ RowDataPacket { erow: 12 } ] 

Есть еще один способ, которым я могу сделать это, чтобы сделать trows доступными для остальной части моего кода?

ответ

6

Вопрос заключается в том, что var trows существует только внутри итератора, так как это function создает свою собственную область, чтобы содержать переменные.

function (corndog) { 
    var trows = corndog.erow; 
    console.log("All rows",trows); 
} // `trows` is removed from existence at this point 

console.log(trows); // ReferencError 

Но, то function имеет доступ к переменным в окружающих областях. Таким образом, вы можете объявить trows вне функции, затем назначьте ее внутри.

var trows; 

_.each(the_rows, function (corndog) { 
    trows = corndog.erow; // note removal of `var` 
    console.log("All rows",trows); 
}); 

console.log(trows); // 12 

Хотя _.each() не является необходимым, когда вы только хотите одно значение. Вы можете получить доступ к определенному индексу коллекции и цепи на что свойство вы после:

var trows = the_rows[0].erow; 

Если есть беспокойство по поводу the_rows быть пустым, вы можете test for that, чтобы избежать ошибок с undefined:

var trows = the_rows.length ? the_rows[0].erow : null; 

Сторона примечания: Обязательно всегда проверяйте err. Если это произойдет, the_rows, вероятно, будет null или undefined.

0

Объявите trows вне цикла:

var trows = 0; 
_.each(the_rows, function (corndog) { 
    trows += corndog.erow; 
    console.log("All rows",trows); 
}); 
1

Я не могу понять, что вы просите - но

var allTrows = []; 
_.each(the_rows, function (corndog) { 
     var trows = corndog.erow; 
     console.log("All rows",trows); 
     allTrows.push (trows); 
}); 

Затем вернитесь allTrows в вашем res.render.

1

В то время как Джонатан и Илья уже дал практические решения для вашей конкретной проблемы, позвольте мне представить общий ответ на вопрос в заголовке:

Самый простой способ заменить _.each() является перебрать массив с помощью равнину for цикл:

for (var i = 0; i < the_rows.length; i++) { 
    var row = the_rows[i]; 
    console.log("In loop: row = the_rows[" + i + "] =", row); 
} 
console.log("After loop: row =", row); 

, или, в ES6 или поздно for...of цикл:

for (var row of the_rows) { 
    console.log("In loop: row =", row); 
} 
console.log("After loop: row =", row); 

(Вы могли также использовать for...in цикл, но you probably shouldn't.)

Поскольку они встроены в циклические конструкции, и не влекут за собой внутреннюю функцию, как _.each() делает любые переменные, определенные в них сохраняют свое последнее значение после того, как петля заканчивается.


Другой способ заменить _.each использует встроенный .forEach() метод JS массивов:

the_rows.forEach(function (row, i) { 
    console.log("In loop: row = the_rows[" + i + "] =", row); 
}); 

или, если вы хотите использовать этот метод перебрать то, что выглядит как массив, но на самом деле не один (таких как, скажем, DOM NodeList):

Array.prototype.forEach.call(the_rows, function (row, i) { 
    console.log("In loop: row = the_rows[" + i + "] =", row); 
}); 

Однако, поскольку .forEach() требует оборачивать петли тело во внутренней функции, как и _.each(), любые переменные, объявленные с использованием var внутри, будут недоступны вне цикла. Однако переменные, объявленные вне функции цикла , являются, видимыми внутри, поэтому вы можете сделать это, например. это:

var last_row; 
the_rows.forEach(function (row, i) { 
    last_row = row; // <-- no "var"! 
    console.log("In loop: last_row = row = the_rows[" + i + "] =", row); 
}); 
console.log("After loop: last_row =", last_row);