@r2sada2r

Почему не проходит перебор всего массива?

var arr = [];
arr[0] = 'sda21g';
arr[5] = 'g42c';
arr[8] = '09-sdq3';
arr[10] = 'm/xndhi';

console.log(arr);

async.each(arr, function(el, callback){
	console.log('----------------------------');
	console.log(el);
	console.log('----------------------------');
	
	callback();
},

function(err) {
	console.log('Прошли все элементы массива arr');
});


Вывод:
[ 'sda21g', , , , , 'g42c', , , '09-sdq3', , 'm/xndhi' ]
----------------------------
sda21g
----------------------------
----------------------------
g42c
----------------------------
----------------------------
09-sdq3
----------------------------
----------------------------
m/xndhi
----------------------------

Если нет пустых элементов в массиве, то все нормально. Скорее всего не проходят все callback в async.each...
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
@iShatokhin
JS developer
Async вызовет финальный callback только тогда, когда пройдут все итерации массива, где количество итераций для него это длина массива. Согласно спецификации JS - длина массива это индекс последнего элемента + 1. В примере указан разряженный массив, а async для перебора использует Array.forEach, который пропускает отсутствующие индексы, соответственно, финальный callback не будет вызван никогда.

Для выхода из данной ситуации можно (на выбор):
  • избегать разряженные массивы
  • ждать релиз Async 0.10, в котором произойдет отказ от Array.forEach в пользу простого цикла for (в master ветке есть соответствующий коммит)
  • перейти на альтернативную (100% совместимую) библиотеку neo_async
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
STJ
@STJ
Front-end developer
Пустые ячейки в массиве == undefined
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы