Что вам нужно, так это ленивая итерация по объекту или массиву. Это невозможно в ES5 (поэтому невозможно в node.js). Мы получим это в конце концов.
Единственное решение - найти модуль узла, который расширяет V8 для реализации итераторов (и, вероятно, генераторов). Я не мог найти какую-либо реализацию. Вы можете посмотреть на исходный код spidermonkey и попробовать написать его на C ++ как расширение V8.
Вы можете попробовать следующее, однако он также загрузит все ключи в память
Object.keys(o).forEach(function(key) {
var val = o[key];
logic();
});
Однако, поскольку Object.keys
является нативным методом, он может обеспечить лучшую оптимизацию.
Benchmark
Как видите, Object.keys значительно быстрее. Вопрос о том, является ли фактическая память более оптимальным, - это другой вопрос.
var async = {};
async.forEach = function(o, cb) {
var counter = 0,
keys = Object.keys(o),
len = keys.length;
var next = function() {
if (counter < len) cb(o[keys[counter++]], next);
};
next();
};
async.forEach(obj, function(val, next) {
// do things
setTimeout(next, 100);
});