Я использую паруса (0.11.0), работающие на nodejs (6.9.1). Я пытаюсь построить массив, заполнив его для цикла. Я отправил бы этот завершенный массив в ответ на клиент. Я пробовал различные методы, как это было предложено людей здесь на переполнение стека, напримерПостроить массив в nodejs through для цикла
обсуждение here предложил
for (var i = yearStart; i < yearEnd+1; i++) {
arr.push(i);
}
На this обсуждения, предлагается использовать:
var array = calendars.map(function(item) {
return item.id;
});
console.log(array);
Точно так же я попробовал много методов, но я сталкиваюсь с той же проблемой, что во время цикла массив заполняется, но как только цикл завершается, массив становится пустым из-за асинхронного процесса, и поэтому я не могу отправить re sponse. Чтобы справиться с этим, я попытался проверить индекс внутри тела цикла и отправить отклик внутри тела цикла самого через
var userArray = [];
_.each(users, function(user, index){
MySQLConnector.query('CALL user_image (?)', [user.id], function(err, userImage){
if(err){
return res.json({"status":"some_error"});
}else{
userID = user.id
userImageID = userImage[0][0].id;
var userInfo = {
userID: userID,
userImageID: userImageID
}
userArray.push(userInfo)
if(index == users.length - 1){
res.json({selectedUsers: userArray});
}
}
});
});
Я начала пустой userArray, а затем перебрать пользователей объекта, где каждый элемент объект характеризуется именем пользователем и индекс. Через запрос MySQL я выборка объекта userImage и в каждой итерации, я создаю объект под названием USERINFO, который состоит из и идентификатора пользователя userImageID. Я нажимаю этот объект на userArray. И после каждой итерации цикла for (_.each
), я проверяю, достигнут ли последний индекс. Как только последний индекс достигнут, последний массив отправляется как ответ до завершения цикла.
Здесь также возникает проблема, что тело массива не всегда полностью заполнено. Причина связана с асинхронным процессом, индекс не всегда соответствует порядку 0,1,2,3,4, .... и он может начинаться с любого числа и может перейти к любому индексу на следующей итерации, например, первый индекс для начала будет 4, второй будет 0, третий - 2 и так далее. Эта последовательность будет различной для каждого запуска этого цикла for. Для пользователя это будет полный случайный процесс. Поэтому, если users.length равен 8, и текущий индекс случайным образом 7 на третьей итерации, условие index == users.length - 1
будут выполнены и ответ будет послан только с массивом, состоящий из 3-х элементов, а не 8.
Может кто-то предложить мне нужен лучший и надежный способ заполнить массив через цикл for в nodejs и отправить этот массив в ответ, чтобы все элементы были включены в массив в исходном порядке?
Он не будет следовать порядку, и я думаю, что у вас будет такая же проблема с картой. Посмотрите на сокращение в lodash и bluebird, я знаю, что в последнем он будет гарантировать порядок, я думаю, что lodash будет таким же, но может быть ошибочным в этом. –
Думая об этом немного больше, в асинхронной библиотеке я часто использую everySeries, это тоже гарантирует заказ и, скорее всего, будет решением для вашего существующего кода. –