2013-12-01 5 views
2

Я пишу приложения с помощью NodeJS, ExpressJS, MongoDB (с Мангуста) ...NodeJS V8 Pass дополнительный аргумент обратного вызова

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

for(var i = 0; i < 10; i++) { 
    recods.findOne({number: i}, function(err,doc){ 
     ... 
    }); 
} 

переменная «я» в области видимости функции обратного вызова передается по ссылке, и результат не желательно.

Когда вызов вызван, цикл уже запущен, и переменная изменилась.

Если я пытаюсь передать аргумент как анонимные функции, не работает, потому что заменить необходимые аргументы:

for(var i = 0; i < 10; i++) { 
    records.findOne({number: i}, (function(err,doc){ 
     ... 
    })(i)); 
} 

Таким образом, я потерял «эээ, документ» аргументы,

Что я могу сделать для решения этой большой проблемы?

ответ

1

Вы можете привязать его к функции обратного вызова, чтобы создать частичную функцию с первым аргументом, равным i:

for (var i = 0; i < 10; i++) { 
    records.findOne({number: i}, function(i, err, doc) { 
    ... 
    }.bind(records, i)); 
} 
+0

Спасибо, брат, эта работа отлично: P – wrivas

1

Вы применяете анонимную функцию в неправильном месте. Он должен применяться вне функции, которая использует i, а не функцию обратного вызова.

for (var i = 0; i < 10; i++) { 
    (function(i) { 
    records.findOne({number: i}, function(err, doc) { 
     ... 
    }); 
    }(i)); 
} 
+0

Спасибо, эта работа тоже. – wrivas

0

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

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
records.find({ number : { $in : numbers } }, function(err, allDocs) { 
    if (err) { throw err; } 
    // allDocs are now available in an array (they aren't ordered) 
    // allDocs.length 
    // allDocs[0].number ... 
}); 

используяОператор(reference) выполняет только один вызов в базе данных и находит все соответствующие документы, а не выполняет индивидуальные вызовы.

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