Возможны ли в JS вложенные колбэки в колбэках?

Serega Novikov
Serega Novikov
526
1
Содержание:
  1. Комментарии
есть JS-код в популярном примере организации асинхронного вызова функций, вот скриншот его (на 21-й минуте 21 секунд):

Вот только этот код этого популярного примера в реальности не работает, вот:

var fcb = function(i, index, arr){console.log(i,index, arr)};
 
 function  asyncForEach (array,cb) {
	  console.log("get"+array);
	array.forEach(function(){ setTimeout (cb, 0);})
}

asyncForEach([1,2,3,4,5,77], fcb); //undefined undefined undefined 

//хотя код выше должен был бы работать так же, как и синхронный вариант:
 [1,2,3,4,5,77].forEach(function(i, index, arr){console.log(i,index, arr )})

habrahabr утверждает: "вложенные колбэки в колбэках, как мы знаем, становятся непригодными" (и откуда это правило, может на спецификацию есть ссылка под рукой?).
Версия моя: не работает код выше, потому что cb в setTimeout (cb, 0) является «вложенным колбэком в колбэке»?
Ну не может же быть в такой популярной лекции JS-гуру ошибка в примере (скорее я недопонимаю, но ведь не работает же реально, елки-палки). Потому и спрашиваю.
Как переписать данный пример из лекции, чтоб работал (без использования промисов)?

Комментарии:

  1. Александр Мальцев
    Александр Мальцев
    15.03.2018, 15:58
    При написании примера допущены следующие ошибки:
    — не указан текущий обрабатываемый элемент для метода forEach();
    — в setTimeout для функции cb не передан аргумент i.

    function asyncForEach(array,cb){
        array.forEach(function(i){
            setTimeout(cb,0,i);
        })
    };
    asyncForEach([1,2,3,4], function(i){
        console.log(i);
    });
    
    Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.